Ciągle dwa/trzy niezależne projekty. Wygląda na to, że będą jednak trzy, bo Pan Bartek „atakuje” temat line followera (świetnie!)
1) zespół od pojazdu po sukcesie sterowania pojazdem przez człowieka (bluetooth) poznawał temat czujki odległości HC-SR04. Zamontowali już nawet „trzymak” w pojeździe – bez użycia wkrętaki! zuchy! 😉 Tak, tak – to „oklepany” układ, ale każdy od czegoś zaczyna – prawda? Trzymam więc kciuki za poprawne oprogramowanie go w pojeździe i zrobienie autonomicznego robota (poruszającego się bez ingerencji człowieka, w tym przypadku: wykrywającego kolizje i zmieniającego kierunek ruchu).
2) „refleks” przeszedł w stan rozbudowany i teraz składa się z 3 losowo zapalanych LEDów, i łapaniu reakcji przez 3 przyciski. Układ:
oraz program (+dużo komentarzy):
//piny z podlaczonymi przyciskami
int btn[]={2,4,6};
//piny z podlaczonymi ledami
int led[]={3,5,7};
void setup() {
Serial.begin(9600);
for (int i=0; i<3; i++){
pinMode(btn[i],INPUT_PULLUP);
pinMode(led[i], OUTPUT);
}
}
unsigned int i;
unsigned int cr,tstart,tstop;
byte bt1, bt2, bt3, LOS;
void loop() {
//"dysko-mode" informujace o poczatku rozgrywki
for(i=0;i<3;i++){
digitalWrite(led[0], HIGH);
delay(100);
digitalWrite(led[1], HIGH);
digitalWrite(led[0], LOW);
delay(100);
digitalWrite(led[2], HIGH);
digitalWrite(led[1], LOW);
delay(100);
digitalWrite(led[2], LOW);
delay(100);
}//"dysko-mode"
//(pseudo)losowe czekanie: od 1s do 5s
delay(random(1000,5000));
//wybor LEDa do zaswiecenia: 1,2 lub 3
LOS=random(1,4);
//wersja tylko do testow: wypisywanie na ekran losowania
Serial.print("LOS=");
Serial.println(LOS);
//wlaczenie wylosowanego LEDa
//dzieki zapisaniu numerow pin-ow do tablicy jest to teraz bardzo proste!
digitalWrite(led[LOS-1], HIGH);
//rozpoczecie mierzenia czasu
tstart = millis();
//czekanie na rekacje uzytkownika - wcisniecie jednego z trzech pyrzycsikow
//zapamietujemy w zmiennych, ktore przyciski sa wcisniete
do{
bt1 = digitalRead(btn[0]);
bt2 = digitalRead(btn[1]);
bt3 = digitalRead(btn[2]);
}while(bt1+bt2+bt3==0); //petla wykonuje sie tak dlugo, az przynajmniej jeden z przyciskow zostanie wcisniety
//zatrzymanie "stopera" skoro cos zostalo wcisniete
tstop = millis();
digitalWrite(led[LOS-1], LOW);
//okreslenie poprawnosci wcisniecia przycisku:
//zakladamy, ze zle wcisniety przycisk (tak wygodniej)
bool ok=false; //czy wygralem?
//sprawdzenie, czy moze jednak zostal wcisniety odpowieni przycisk
switch(LOS){
case 1: if ((bt1==1)&&(bt2==0)&&(bt3==0)) ok=true;break;
case 2: if ((bt2==1)&&(bt1==0)&&(bt3==0)) ok=true;break;
case 3: if ((bt3==1)&&(bt1==0)&&(bt2==0)) ok=true;break;
}//swicth
//jesli wygrales, to stosowny komunikat
if (ok){
cr = tstop-tstart; //cr = "czas rekacji"
Serial.print("brako! gratulacje! ");
Serial.print("czas reakcji:");
Serial.println(cr);
}//ok==true
else{
Serial.println("pudło! nie ten przycisk!");
}
delay(1000);
}//loop
Można jeszcze popracować nad tym kodem – można dodać kolejny (inny) „dysko-mode” informujące, że się poprawnie wybrało przycisk, albo zaświecić wszystkimi LED-ami, gdy użytkownik „spudłował”. W przyszłości dodamy do układu wyświetlacz LCD aby tam pojawił się stosowny komunikat, a nie na ekranie podłączonego komputera.
3) na bazie TSOP5000 (kiedyś już ją poznawaliśmy) powstanie czujnik do pojazdu typu line follower – praca się właśnie rozpoczyna. Działa już (podwójny) układ czujników, więc teraz rozpoczął się drugi etap: układ 3/4/5? czujek na własnoręcznej płytce prototypowej + pojazd na sterowniku L298.
Dlaczego własnoręcznie robiona czujka, a nie jedna z „kupnych”, jak te ze zdjęć poniżej?
Odpowiedź jest prosta: bo to fajniejsze i mamy więcej zabawy podczas pracy, a o to właśnie chodzi!
KG, 2018