Thicket data repository for the EEG
at main 3.0 kB view raw
1{ 2 "id": "https://www.tunbury.org/2025/01/18/arduino-pwm-train-controller", 3 "title": "Arduino PWM Train Controller", 4 "link": "https://www.tunbury.org/2025/01/18/arduino-pwm-train-controller/", 5 "updated": "2025-01-18T15:15:00", 6 "published": "2025-01-18T15:15:00", 7 "summary": "Circuit", 8 "content": "<h1>Circuit</h1>\n\n<p><img alt=\"\" src=\"https://www.tunbury.org/images/train-controller-diagram.png\"></p>\n\n<h1>Case</h1>\n\n<p>3D printable STL files are available for download: <a href=\"https://www.tunbury.org/images/train-controller.stl\">STL files</a></p>\n\n<p><img alt=\"\" src=\"https://www.tunbury.org/images/train-controller-fusion-360.png\"></p>\n\n<h1>Arduino Code</h1>\n\n<div><div><pre><code>/*\n * Arduino Nano PWM Dual Train Controller\n * This sketch reads values from two potentiometers connected to A0 and A1\n * and uses these values to control the speed and direction of a motor via\n * an L298N motor driver. The motor speed is controlled using PWM signals\n * on pins D5 and D10, and the direction is controlled using digital signals\n * on pins D6, D7, D8, and D9.\n */\n\n// Pin definitions\nconst int potLeftPin = A0;\nconst int potRightPin = A1;\nconst int enaPin = 10;\nconst int in1Pin = 9;\nconst int in2Pin = 8;\nconst int in3Pin = 7;\nconst int in4Pin = 6;\nconst int enbPin = 5;\n\nvoid setup() {\n // Initialize serial communication\n Serial.begin(9600);\n\n // Set motor control pins as outputs\n pinMode(enbPin, OUTPUT);\n pinMode(enaPin, OUTPUT);\n pinMode(in1Pin, OUTPUT);\n pinMode(in2Pin, OUTPUT);\n pinMode(in3Pin, OUTPUT);\n pinMode(in4Pin, OUTPUT);\n}\n\nvoid loop() {\n // Read potentiometer values\n int potLeft = analogRead(potLeftPin);\n int potRight = analogRead(potRightPin);\n\n // Map potentiometer values to PWM range\n int pwmLeft = pow(potLeft - 512, 2) / 1024;\n int pwmRight = pow(potRight - 512, 2) / 1024;\n\n // Control motor speed and direction\n analogWrite(enaPin, pwmLeft);\n analogWrite(enbPin, pwmRight);\n\n // Set motor direction based on potentiometer values\n if (potLeft &lt; 512) {\n digitalWrite(in1Pin, LOW);\n digitalWrite(in2Pin, HIGH);\n } else {\n digitalWrite(in1Pin, HIGH);\n digitalWrite(in2Pin, LOW);\n }\n\n if (potRight &lt; 512) {\n digitalWrite(in3Pin, LOW);\n digitalWrite(in4Pin, HIGH);\n } else {\n digitalWrite(in3Pin, HIGH);\n digitalWrite(in4Pin, LOW);\n }\n\n // Print values to serial monitor for debugging\n Serial.print(\"potLeft: \");\n Serial.print(potLeft);\n Serial.print(\" PWMLeft: \");\n Serial.print(pwmLeft);\n Serial.print(\" potRight: \");\n Serial.print(potRight);\n Serial.print(\" PWMRight: \");\n Serial.println(pwmRight);\n\n // Small delay to stabilize readings\n delay(100);\n}\n</code></pre></div></div>", 9 "content_type": "html", 10 "author": { 11 "name": "Mark Elvers", 12 "email": "mark.elvers@tunbury.org", 13 "uri": null 14 }, 15 "categories": [ 16 "3d-printing", 17 "tunbury.org" 18 ], 19 "source": "https://www.tunbury.org/atom.xml" 20}