Stap 3: Algoritme voor het ontvangen en verzenden van gegevens
Om het verzenden van gegevens, ik heb twee functies voor het uitvoeren van dit proces, ze zijn: send_data(int num) en completion_Scan().
Ik heb variabelen toegewezen met de code die overeenkomt met de tabel voor de eerste 2 scenario's genaamd links en rechts. Voor dit voorbeeld zullen we ons alleen richten op communiceren dat de bal aan de linker- of rechterzijde is. Wanneer de locatie van de bal is vastgesteld, wordt de waarde verzonden aan de functie send_data waar het gehele getal is opgesplitst in een matrix en de waarden gepulseerde high(1) of low(0). Wanneer alle waarden zijn gepulseerde, de completion_Scan() functie heet en alleen wordt afgesloten wanneer een voltooiing-signaal wordt verzonden vanuit de oorspronkelijke Arduino die het bericht heeft ontvangen.
Pseudocode:
int right=10100; int left = 10010; if (ball is on left side){ send_data(right); completion_Scan(); } if (ball is on the right side){ send_data(left); completion_Scan(); }
Wanneer send_Data wordt aangeroepen, wordt het gehele getal doorgegeven gehakt in een 5 bit array met behulp van de volgende algoritme:
int send_data(int num){ data[4] = num % 10; data[3] = (num % 100 - data[4])/10; data[2] = (num % 1000 - data[3] - data[4])/100; data[1] = (num % 10000 - data[2] - data[3] - data[4])/1000; data[0] = (num % 100000 - data[1] - data[2] - data[3] - data[4])/10000;
Met behulp van de modulo functie, die ik heb gemaakt een algoritme voor het opslaan van de individuele bits in een unieke matrixpositie gegevens genoemd. Bijvoorbeeld, als 10100 wordt verzonden naar send_data, dan is gegevens [4] zal slaan de rest van 10100 gedeeld door 10.
gegevens [4] = (10100 mod 10) = 0;
gegevens [3] = ((10100 mod 100) - 0) / 10 = 0
gegevens [2] = 1
gegevens [1] = 0
gegevens [0] = 1
De volledige data array wordt verwerkt via een "for"-instructie, en wanneer een waarde van 1 wordt gedetecteerd, een hoog signaal via de draad is gepulseerde voor 200ms. Omgekeerd, wanneer een waarde van 0 wordt gedetecteerd, een laag signaal is gepulseerde via de draad voor de zelfde hoeveelheid tijd.
for (y=0; y<5; y++){ //send high or low if (data[y]==1){ turn PC5 HIGH } else{ turn PC5 LOW } delay(200); }
Om te ontvangen gegevens, is de ontvangende Arduino altijd wachten op een eerste hoge signaal. Onmiddellijk nadat het is gedetecteerd, wordt het bericht dat wordt verzonden in een array op een vergelijkbare manier opgeslagen. De definitieve code ontvangen wordt vervolgens vergeleken om te bepalen van de gewenste output.
Ik heb de volledige code opgenomen voor zowel Mechbot als EVShield. Het enige verschil is dat heb ik ook een Serial.prints voor foutopsporing, drukknoppen wilt verzenden of beëindigen van de communicatie, en een LED knipperen tijdens de verzending. Opmerking: u kunt beide bestanden downloaden of klik met de rechtermuisknop en selecteer "openen in nieuw tabblad" om de code weer te geven.