Bonjour à tous,
Après une longue absence je reprends mon projet de robot à chenille.
Je viens de terminer la lecture des capteurs ultrasonic à intervalle régulier et j'aimerais commencer le mode automatique ( robot qui se déplace tout seul et dès qu'il rencontre un obstacle change de direction )
Pour l'instant j'ai fait un test avec mon code actuel c'est le mode 1.
Pourriez vous me montrer des exemples de code pour que je puisse m'en inspirer et paramétrer la distance et par exemple le temps de pause entre les changements de direction ?
#include <LiquidCrystal.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Ultrasonic.h> LiquidCrystal lcd(52, 50, 48, 46, 44, 42); #define ONE_WIRE_BUS 22 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature ds18b20(&oneWire); #define T1 24 #define E1 26 #define T2 23 #define E2 25 #define T4 30 #define E4 31 Ultrasonic ultrasonic1(T1, E1); Ultrasonic ultrasonic2(T2, E2); Ultrasonic ultrasonic4(T4, E4); int Sequence[][3] = { {255, 0 , 0 }, {0, 255 , 0 , }, {0, 0 , 255 }, {255, 255 , 0 }, {0, 255 , 255 , }, {255, 0 , 255 }, {255, 255 , 255 }, }; // Moteur A int dir1PinA = 13; int dir2PinA = 12; // Moteur B int dir1PinB = 11; int dir2PinB = 8; // Vitesse Moteur int speedPinA = 10; int speedPinB = 9; int duree = 0; char incomingByte; int mode; long timerefreshUltrason = 200; long previousMillisUltrason = 0; long timedatasend = 1000; long previousMillis = 0; long timerefreshLCD = 1000; long previousMillisLCD = 0; long timerefreshPIR = 250; long previousMillisPIR = 0; long timerefreshRGB = 1000; long previousMillisRGB = 0; long previousMillisBuzzer = 0; int buzzerPin = 2; int beepdone = 0; long timerefreshLED = 250; long previousMillisLED = 0; int ledcamerablink = 0; int ledCameraState = LOW; int ledCameraPin = 28; int capteurIrPin = 27; int laserPin = 29; int laserState = LOW; int capteurIr = 0; int BluePin = 3; int GreenPin = 4; int RedPin = 5; int pwmred= 0; int pwmblue = 0; int pwmgreen = 0; String motorA = ""; String motorB = ""; int speedA = 0; int speedB = 0; float U1 = 0; float U2 = 0; float U3 = 0; float U4 = 0; int i=0; int distanceU2 = 10; void setup() { ds18b20.begin(); lcd.begin(16, 2); Serial.begin(115200); lcd.print("KBOT"); pinMode(dir1PinA, OUTPUT); pinMode(dir2PinA, OUTPUT); pinMode(dir1PinB, OUTPUT); pinMode(dir2PinB, OUTPUT); pinMode(speedPinB, OUTPUT); pinMode(speedPinA, OUTPUT); pinMode(ledCameraPin, OUTPUT); pinMode(buzzerPin, OUTPUT); pinMode(laserPin, OUTPUT); pinMode(capteurIrPin, INPUT); pinMode(BluePin, OUTPUT); pinMode(GreenPin, OUTPUT); pinMode(RedPin, OUTPUT); } float temperature(){ ds18b20.requestTemperatures(); return ds18b20.getTempCByIndex(0); } float ultrason(){ long microsec0 = ultrasonic1.timing(); float cmMsec0 = ultrasonic1.convert(microsec0, Ultrasonic::CM); long microsec1 = ultrasonic2.timing(); float cmMsec1 = ultrasonic2.convert(microsec1, Ultrasonic::CM); long microsec4 = ultrasonic4.timing(); float cmMsec4 = ultrasonic4.convert(microsec4, Ultrasonic::CM); U1 = cmMsec0; U2 = cmMsec1; U4 = cmMsec4; return U1,U2,U4; } //void stopbeep(int timebuzzerOn){ //long currentMillis = millis(); // // if(currentMillis - previousMillisBuzzer > timebuzzerOn) { // previousMillisBuzzer = currentMillis; // analogWrite(buzzerPin, 0); // // } //} void beep (int buzzerpwm, int timebuzzerOn) { if (beepdone == 1){ analogWrite(buzzerPin, buzzerpwm); int duree = timebuzzerOn; long previousMillisBuzzer = millis(); beepdone = 0; } } void stopBeepAtEnd () { long currentMillis = millis(); if(currentMillis - previousMillisBuzzer > duree) { previousMillisBuzzer = currentMillis; analogWrite(buzzerPin, 0); beepdone = 1; } } void rgbled (int pwmred, int pwmgreen, int pwmblue) { analogWrite(RedPin,pwmred); analogWrite(GreenPin,pwmgreen); analogWrite(BluePin,pwmblue); } void motor (String motorA, int speedA, String motorB, int speedB) { if (motorA == "forward"){ analogWrite(speedPinA, speedA); digitalWrite(dir1PinA, HIGH); digitalWrite(dir2PinA, LOW); } else if (motorA == "backward"){ analogWrite(speedPinA, speedA); digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); } else{ } if (motorB == "forward"){ analogWrite(speedPinB, speedB); digitalWrite(dir1PinB, LOW); digitalWrite(dir2PinB, HIGH); } else if (motorB == "backward"){ analogWrite(speedPinB, speedB); digitalWrite(dir1PinB, HIGH); digitalWrite(dir2PinB, LOW); } else{ } } void loop() { if (Serial.available() > 0) { lcd.setCursor(0, 0); lcd.print("KBOT CONNECTED"); incomingByte = Serial.read(); //Serial.println(incomingByte, DEC); switch (incomingByte) { case 'L': ledcamerablink = 1; break; case 'Z': ledcamerablink = 0; digitalWrite(ledCameraPin, LOW); previousMillisLED = 0; break; case 'T': ledcamerablink = 0; digitalWrite(ledCameraPin, HIGH); previousMillisLED = 0; break; case 'Q': digitalWrite(laserPin, HIGH); beep(255,500); break; case 'S': digitalWrite(laserPin, LOW); break; case 'A': motor("forward",60, "forward",60); //beep(255, 2000); break; case 'B': digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, LOW); digitalWrite(dir1PinB, LOW); digitalWrite(dir2PinB, LOW); break; case 'C': motor("backward",80, "backward",80); break; case 'D': motor("backward",20, "forward",20); break; case 'G': motor("forward",20, "backward",20); break; case 'H': Serial.println("Mode automatique"); mode = 1; break; default: Serial.print("commande : "); Serial.print(incomingByte); break; } } if (mode == 1){ if ( U2 > distanceU2) { rgbled(0,255,0); motor("forward",70, "forward",70); } else{ rgbled(255,0,0); motor("backward",70, "backward",70); } } // Fréquence de rafraichissement des capteurs ultrasons long currentMillis = millis(); if(currentMillis - previousMillisUltrason > timerefreshUltrason) { previousMillisUltrason = currentMillis; ultrason(); } currentMillis = millis(); if(currentMillis - previousMillis > timedatasend) { previousMillis = currentMillis; //float sondetemperature = temperature(); float sondetemperature = 35; Serial.println(sondetemperature); Serial.print("U1 : "); Serial.println(U1); Serial.print("U2 : "); Serial.println(U2); Serial.print("U4 : "); Serial.println(U4); Serial.println(capteurIr); Serial.println(timerefreshLED); } currentMillis = millis(); if(currentMillis - previousMillisLCD > timerefreshLCD) { previousMillisLCD = currentMillis; lcd.clear(); lcd.print("U1 :"); lcd.print(U1); lcd.setCursor(0, 2) ; lcd.print("U2 :"); lcd.print(U2); lcd.print(" U4 :"); lcd.print(U4); } currentMillis = millis(); if (ledcamerablink == HIGH){ if(currentMillis - previousMillisLED > timerefreshLED) { previousMillisLED = currentMillis; if (ledCameraState == LOW) { ledCameraState = HIGH; } else { ledCameraState = LOW; } digitalWrite(ledCameraPin, ledCameraState); } } //currentMillis = millis(); //if(currentMillis - previousMillisPIR > timerefreshPIR) { // previousMillisPIR = currentMillis; // capteurIr = digitalRead(capteurIrPin); // if (capteurIr==1){//rgbled(255,0,0); // // } // else { //rgbled(0,255,0); // } // } currentMillis = millis(); if(currentMillis - previousMillisRGB > timerefreshRGB) { previousMillisRGB = currentMillis; rgbled(Sequence[i][0],Sequence[i][1],Sequence[i][2]); i++; if (i> 6){i=0;} } stopBeepAtEnd (); }
Bien à vous
Bypbop