From db2b66abaa1c0e0f25976c9c6a5bf1412219898a Mon Sep 17 00:00:00 2001 From: Clovis ARSAC Date: Sun, 23 Nov 2025 18:32:18 +0100 Subject: [PATCH] Added PAMi code --- PAMI_LineFollowing_Stop.ino | 145 ++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 PAMI_LineFollowing_Stop.ino diff --git a/PAMI_LineFollowing_Stop.ino b/PAMI_LineFollowing_Stop.ino new file mode 100644 index 0000000..17fcefb --- /dev/null +++ b/PAMI_LineFollowing_Stop.ino @@ -0,0 +1,145 @@ +// This code works for the PAMI robots marked with an S and a 1 +// It makes the robot follow the black line and stop in green squares. +// For a second green square stop, tape sensor_2 on the right side, at 3.5cm from +// the center (0.5cm from the edge). For a first green square stop, tape sensor_2 +// on the left side, at 3.5cm from the center (0.5cm from the edge). + +// Ultrasound sensor +const int trigPin = 12; +const int echoPin = 13; +float duration; +float distance; +unsigned long lastDistanceCheck = 0; + + +// Motor pins +const int A_Direction = 2; // A = left motor +const int A_Speed = 5; +const int B_Direction = 4; // B = right motor +const int B_Speed = 6; + +const int sensorPin = 8; +const int sensorPin_2 = 9; //side sensor Ligne noire: 1cm width, rectangle noir: 5 cm width + +// Tirette +const int cablePin = 7; + +// Timers +//unsigned long thresholdTime = 100; +bool timerStarted = false; +unsigned long startTime = 0; +bool done = false; +bool isMoving = true; +const int Black = 1; // 1 = robot to the left of the line , // 0 = right + +// Duration calculation for obstacle deteaction +float distanceUltra() { + digitalWrite(trigPin, LOW); + delayMicroseconds(2); + digitalWrite(trigPin, HIGH); + delayMicroseconds(10); + digitalWrite(trigPin, LOW); + duration = pulseIn(echoPin, HIGH) / 58.00; // cm + return duration; +} + +// Obstacle Detection function to stop motors +void distanceStop() { + distance = distanceUltra(); + Serial.println(distance); // Check if it works + if (distance <= 12) { + digitalWrite(A_Direction, HIGH); + analogWrite(A_Speed, 0); + digitalWrite(B_Direction, HIGH); + analogWrite(B_Speed, 0); + delay(3000); // Stop time + } +} + +// Line following +void lineFollowing() { + int Center_Tra_Value = digitalRead(sensorPin); + + if (isMoving){ + if (Center_Tra_Value == Black) { + // Go slightly left when black + digitalWrite(A_Direction, HIGH); + analogWrite(A_Speed, 40); + digitalWrite(B_Direction, LOW); + analogWrite(B_Speed, 50); + } else { + + // Go slightly right when white + digitalWrite(A_Direction, HIGH); + analogWrite(A_Speed, 50); + digitalWrite(B_Direction, LOW); + analogWrite(B_Speed, 40); + } + } + else{digitalWrite(A_Direction, HIGH); + analogWrite(A_Speed, 0); + digitalWrite(B_Direction, LOW); + analogWrite(B_Speed, 0); } +} + +void setup() { + Serial.begin(9600); + + pinMode(cablePin, INPUT_PULLUP); + pinMode(sensorPin, INPUT); + pinMode(sensorPin_2, INPUT); + pinMode(A_Direction, OUTPUT); + pinMode(A_Speed, OUTPUT); + pinMode(B_Direction, OUTPUT); + pinMode(B_Speed, OUTPUT); + pinMode(trigPin, OUTPUT); + pinMode(echoPin, INPUT); + + Serial.println("Robot Ready"); +} + +void loop() { + int pinState = digitalRead(cablePin); + + // Wait for tirette to start + if (pinState == HIGH) { // HIGH = no connection between D7 and GND + // Start + if (!timerStarted) { + startTime = millis(); + timerStarted = true; + } + + if (digitalRead(sensorPin_2) == Black){ + digitalWrite(A_Direction, HIGH); + analogWrite(A_Speed, 0); + digitalWrite(B_Direction, LOW); + analogWrite(B_Speed, 0); + isMoving = false; + //while (true) {/*stop the robot*/} + } + + // Follow line + if (timerStarted && millis() - startTime >= 2000UL) { // 2 seconds delay + lineFollowing(); + done = true ; + } + + // Stop + if (done) { + digitalWrite(A_Direction, HIGH); + analogWrite(A_Speed, 0); + digitalWrite(B_Direction, LOW); + analogWrite(B_Speed, 0); + } + + // Obstacle detection + if ( millis() - lastDistanceCheck >= 500UL) { + lastDistanceCheck = millis(); + distanceStop(); + } + } else { + timerStarted = false; + done = false; + } +} +