Advertisement
Shahar_Goldenberg

roboLine 0.2

May 29th, 2023
1,131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3. LiquidCrystal_I2C lcd(0x27,16,2);
  4.  
  5. int IR_SENSOR = A1;
  6. int LED = 13;
  7. int IR_VALUE = 0;
  8. int DIRECTION;
  9. int speed     = 40;
  10. int speeDiff  = 0;
  11.  
  12. int enA       = 9;
  13. int inA1      = 8;
  14. int inA2      = 7;
  15. int enB       = 3;
  16. int inB3      = 5;
  17. int inB4      = 4;
  18. int buttonPin = 12;
  19.  
  20. float Pid       = 0.09;
  21.  
  22. void setup() {
  23.   Serial.begin(9600);
  24.   pinMode(IR_SENSOR, INPUT);
  25.   pinMode(LED,  OUTPUT);
  26.   pinMode(enA,  OUTPUT);
  27.   pinMode(enB,  OUTPUT);
  28.   pinMode(inA1, OUTPUT);
  29.   pinMode(inA2, OUTPUT);
  30.   pinMode(inB3, OUTPUT);
  31.   pinMode(inB4, OUTPUT);
  32.   pinMode(buttonPin, INPUT_PULLUP);   //Configuration push button
  33.   digitalWrite(inA1, LOW);
  34.   digitalWrite(inA2, LOW);
  35.   digitalWrite(inB3, LOW);
  36.   digitalWrite(inB4, LOW);
  37.   lcd.init();
  38.   lcd.clear();
  39.   lcd.backlight();
  40.  
  41.   writeToScreen("RoboGold Init...", "STARTING!");
  42.   delay(1000);
  43.   roboRun();
  44. }
  45.  
  46. void roboRun () {
  47.   int mid = 377;
  48.   writeToScreen("To recalibrate", "");
  49.   delay(500);
  50.   writeToScreen("press now,", "...or just wait");
  51.   unsigned long startTimer = millis();
  52.   for(;startTimer + 2000 > millis();){
  53.     if(!digitalRead(buttonPin)) {
  54.       mid = calibrate();
  55.     }
  56.   }
  57.  
  58.   writeToScreen("I'm Ready!", "Hit me!");
  59.   while(digitalRead(buttonPin)) {delay(1);}
  60.   delay(100);
  61.  
  62.   while (true){
  63.     drive(mid);
  64.     /*if(!digitalRead(buttonPin)){
  65.       writeToScreen("stopping", "");
  66.       digitalWrite(inA2, LOW);
  67.       digitalWrite(inB4, LOW);
  68.       return;
  69.     }*/
  70.   }
  71.   writeToScreen("I'm done", ";-)");
  72. }
  73.  
  74. void drive (int mid) {
  75.   int correction = (mid - analogRead(IR_SENSOR))*Pid;
  76.   delay(5);
  77.   analogWrite(enA, speed - speeDiff + correction);
  78.   analogWrite(enB, speed + speeDiff - correction);
  79.   digitalWrite(inA2, HIGH);
  80.   digitalWrite(inB4, HIGH);
  81. }
  82.  
  83. int calibrate(){
  84.   writeToScreen("Starting to", "calibrate");
  85.   unsigned long startTimer = millis();
  86.   int black = analogRead(IR_SENSOR), white = analogRead(IR_SENSOR), IR_Value;
  87.   for(;startTimer + 4000 > millis();){
  88.     IR_Value = analogRead(IR_SENSOR);
  89.     if(IR_Value > black) { black = IR_Value; }
  90.     if(IR_Value < white) { white = IR_Value; }
  91.     writeToScreen("Calibratint...", "b: "+(String)(black)+", w: "+(String)(white));
  92.     delay(100);
  93.   }
  94.   return (black - white)/2;
  95. }
  96.  
  97. void writeToScreen(String line1, String line2){
  98.   lcd.clear();
  99.   lcd.setCursor(0,0);
  100.   lcd.print(line1);
  101.   lcd.setCursor(0,1);
  102.   lcd.print(line2);
  103. }
  104.  
  105.  
  106. int calibrate2 () {
  107.   writeToScreen("Place sensor","over black");
  108.   delay(200);
  109.   while(digitalRead(buttonPin)) {delay(1);}
  110.  
  111.   int black = analogRead(IR_SENSOR);
  112.   writeToScreen("Comleted!", " ");
  113.   delay(1000);
  114.  
  115.   writeToScreen("Place sensor", "over white");
  116.   while(digitalRead(buttonPin)) {delay(1);}
  117.  
  118.   int white = analogRead(IR_SENSOR);
  119.   writeToScreen("Comleted!", " ");
  120.   delay(500);
  121.   lcd.clear();
  122.  
  123.   return (black - white)/2;
  124. }
  125. void loop() {}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement