Line follower
#include <Adafruit_NeoPixel.h>int pwm_a = 3; //PWM control for motor outputs 1 and 2 is on digital pin 3int pwm_b = 11; //PWM control for motor outputs 3 and 4 is on digital pin 11int dir_a = 12; //direction control for motor outputs 1 and 2 is on digital pin 12int dir_b = 13; //direction control for motor outputs 3 and 4 is on digital pin 13int leftLED = 0;int rightLED = 1;int leftGND = 2;int rightGND = 3;int LED_COUNT = 1;int RGBVCC = 10;int RGBData = 9;Adafruit_NeoPixel leds = Adafruit_NeoPixel(LED_COUNT, RGBData, NEO_RGB + NEO_KHZ800);int vooruit_a = HIGH; // polariteit motor aint vooruit_b = HIGH; // polariteit motor bint zwartGrens = 600;int draaiSnelheid = 150;int snelheid = 150;int vooruitTijd = 400;int pauzetijd = 10;void setup(){ pinMode(pwm_a, OUTPUT); //Set control pins to be outputs pinMode(pwm_b, OUTPUT); pinMode(dir_a, OUTPUT); pinMode(dir_b, OUTPUT); pinMode(leftLED, OUTPUT); pinMode(rightLED, OUTPUT); // Stel RGB LED voeding en data in pinMode(RGBVCC, OUTPUT); digitalWrite(RGBVCC, HIGH); pinMode(RGBData, OUTPUT); leds.begin(); leds.clear(); leds.show(); // Maak extra GND voor LED's pinMode(leftGND, OUTPUT); pinMode(rightGND, OUTPUT); digitalWrite(leftGND, LOW); digitalWrite(rightGND, LOW); // Zet beide motoren stil analogWrite(pwm_a, 0); analogWrite(pwm_b, 0); // Stel de seriele poort in om de sensor data te ontvangen //Serial.begin(9600);}void loop(){ digitalWrite(leftLED, LOW); digitalWrite(rightLED, HIGH); leds.setPixelColor(0, 0xff0000); leds.show(); // Draai de zwarte lijn op int sensorVal = analogRead(A0); if(sensorVal < zwartGrens) { // Start rond te draaien rond(true); // Draai rond totdat de lijn gevonden is do { sensorVal = analogRead(A0); //Serial.println(sensorVal); } while(sensorVal < zwartGrens); // Stop met draaien zodra de lijn gevonden is //stoppen(); delay(pauzetijd); } leds.setPixelColor(0, 0x0000ff); leds.show(); digitalWrite(leftLED, HIGH); digitalWrite(rightLED, HIGH); // Ga vooruit vooruit(); // Blijf een tijdje vooruit gaan of totdat de lijn verlaten wordt int start = millis(); int duur; do { sensorVal = analogRead(A0); duur = millis() - start; } while(sensorVal > zwartGrens && duur < vooruitTijd); //stoppen(); delay(pauzetijd); digitalWrite(leftLED, HIGH); digitalWrite(rightLED, LOW); leds.setPixelColor(0, 0x00ff00); leds.show(); // Draai even van de zwarte lijn af rond(false); sensorVal = analogRead(A0); if(sensorVal > zwartGrens) { // Start rond te draaien rond(false); // Draai rond totdat de lijn gevonden is do { sensorVal = analogRead(A0); //Serial.println(sensorVal); } while(sensorVal > zwartGrens); // Stop met draaien zodra de lijn gevonden is //stoppen(); delay(pauzetijd); }}void stoppen() { // Niet meteen stoppen zodat de sensorwaarden een klein stukje voorbij gereden worden... delay(50); analogWrite(pwm_a, 0); analogWrite(pwm_b, 0); // altijd even een tijdje stil staan zodat je kan volgen wat er gebeurt delay(1000);}/* * richting, true om met de klok mee te draaien. False voor tegen de klok in. */void rond(boolean richting) { digitalWrite(dir_a, vooruit_a xor richting); digitalWrite(dir_b, !(vooruit_b xor richting)); analogWrite(pwm_a, motorenAan()?draaiSnelheid:0); analogWrite(pwm_b, motorenAan()?draaiSnelheid:0);}void vooruit() { digitalWrite(dir_a, vooruit_a); digitalWrite(dir_b, vooruit_b); analogWrite(pwm_a, motorenAan()?snelheid:0); analogWrite(pwm_b, motorenAan()?snelheid:0);}boolean motorenAan() { int val = analogRead(A5); return val > 300;}