Labyrint Problemlösaren Robot, med artificiell intelligens med Arduino (3 / 10 steg)
Steg 3: Installera och testa den nya sensorer
Den nya matrisen nu 7 sensorer, är monterad på ett sätt att de 5 original som uteslutande används för PID control (och upptäckt av"full", förklarade senare) och den nya 2 vänstern som ska användas för vänster och höger korsningen upptäckt bara.
Som en snabb genomgång, låt oss komma ihåg hur den 5 original "digital" sensorer fungera:
Om en sensor är centrerad avseende den svarta linjen, kommer att bara att särskilda sensorn producera en hög. Av andra sidan, bör avståndet mellan sensorer beräknas för att tillåta att 2 sensorer kan täcka den fulla bredden av den svarta linjen samtidigt, också producera en hög signal på båda sensorerna.
Hur de 2 nya "analog" sensorerna fungera:
Om en av sensorerna är centrerad avseende den svarta linjen, produktionen kommer att vara en analog värde, vanligtvis producerar en utgång på Arduino ADC bellow "100" (kom ihåg att ADC ger en utgång från 0 till 1023). Med ljusare ytor, produktionsvärde blir högre (jag testade 500 600 över vitt papper, till exempel). Detta värde måste testas på olika situationer av ljus och ytan material att definiera den korrekta tröskelvärde för konstanten som ska användas i ditt fall (se bilden här).
Titta på Arduino koden, var och en av sensorerna kommer att definieras med ett visst namn (anser att den ursprungliga linjen följa sensorn mer till vänster måste tilldelas med en etikett "0"):
CONST int lineFollowSensor0 = 12; Med hjälp av Digital ingång
CONST int lineFollowSensor1 = 18; Med Analog Pin A4 som Digital ingång
CONST int lineFollowSensor2 = 17; Med Analog Pin A3 som Digital ingång
CONST int lineFollowSensor3 = 16. Med Analog Pin A2 som Digital ingång
CONST int lineFollowSensor4 = 19. Med Analog Pin A5 som Digital ingång
CONST int farRightSensorPin = 0; Analoga Pin A0
CONST int farLeftSensorPin = 1; Analoga Pin A1
För att komma ihåg, är möjligt 5 ursprungliga sensor matrisen utgång när du följer en linje:
- 1 1 1 1 1
- 0 0 0 0 0
- 0 0 0 0 1
- 0 0 0 1 1
- 0 0 0 1 0
- 0 0 1 1 0
- 0 0 1 0 0
- 0 1 1 0 0
- 0 1 0 0 0
- 1 1 0 0 0
- 1 0 0 0 0
Med tillägg av de 2 nya är deras möjliga utgångar:
- Längst till vänster Sensor: Analog utgång högre eller lägre än en TRÖSKEL
- Längst till höger Sensor: Analog utgång högre eller lägre än en TRÖSKEL
Lagring för att värdena för varje sensor skapas en array variabel för de ursprungliga 5 digitala sensorerna:
int LFSensor [5] = {0, 0, 0, 0, 0};
Och två heltal variabler för 2 nya analoga sensorer:
int farRightSensor = 0;
int farLeftSensor = 0;
Varje position i matrisen och variabler uppdateras ständigt med produktionen av var och en av sensorerna:
LFSensor [0] = digitalRead(lineFollowSensor0);
LFSensor [1] = digitalRead(lineFollowSensor1);
LFSensor [2] = digitalRead(lineFollowSensor2);
LFSensor [3] = digitalRead(lineFollowSensor3);
LFSensor [4] = digitalRead(lineFollowSensor4);
farRightSensor = analogRead(farRightSensorPin);
farLeftSensor = analogRead(farLeftSensorPin);
Att ha 5 sensorer, tillåter som såg i efterföljare linje Robot-projektet för en "fel variabel" som hjälper till att styra robotens läge över linjen. Också, en variabel som kallas "mode" används för definition om roboten följer en linje över en kontinuerlig linje, en korsning eller ingen linje alls.
Denna "mode" variabel används också med "långt vänster/höger" sensorer. För representation, låt oss betrakta långt vänster och höger sensorerna med 3 möjliga statusvärden: H (högre än TRÖSKELVÄRDET), L (mindre än TRÖSKELVÄRDET) och X (irrelevant). För digital output, kommer den vanliga 0, 1 och vi kommer också att införa X:
- X 1 1 1 1 1 X == > läge = CONT_LINE; fel = 0;
- H 0 X X X X L == > läge = RIGHT_TURN; fel = 0; (se exemplet på bilden ovan)
- L X X X X 0 H == > läge = LEFT_TURN; fel = 0;
- X 0 0 0 0 0 X == > läge = NO_LINE; fel = 0;
- H 0 0 0 0 1 H == > läge = FOLLOWING_LINE; fel = 4;
- H 0 0 0 1 1 H == > läge = FOLLOWING_LINE; fel = 3;
- H 0 0 0 1 0 H == > läge = FOLLOWING_LINE; fel = 2;
- H 0 0 1 1 0 H == > läge = FOLLOWING_LINE; fel = 1;
- H 0 0 1 0 0 H == > läge = FOLLOWING_LINE; fel = 0;
- H 0 1 1 0 0 H == > läge = FOLLOWING_LINE; fel = -1;
- H 0 1 0 0 0 H == > läge = FOLLOWING_LINE; fel = -2
- H 1 1 0 0 0 H == > läge = FOLLOWING_LINE; fel = -3;
- H 1 0 0 0 0 H == > läge = FOLLOWING_LINE; fel = -4;
Så, genomföra ovanstående logiken i funktionen:
void readLFSsensors()
Returnerar de variabler "mode" och "fel" som kommer att användas på programmets logik.
Det är viktigt att testa logiken av sensorerna innan Följ med projektet. Funktionen nedan ingår i koden och kan användas för att testa:
void testSensorLogic(void)
{
Serial.Print (farLeftSensor);
Serial.Print ("< == vänster RIGH == >");
Serial.Print (farRightSensor);
Serial.Print ("läge:");
Serial.Print (läge);
Serial.Print ("fel:");
Serial.println (fel);
}