Warsztaty Arduino

W skrócie na warsztatach będziemy bawić się zestawami modułów do arduino i tworzyć proste projekty. Zanim pojawicie się na zajęciach trzeba zainstalować odpowiednie oprogramowanie dostępne na stronie https://www.arduino.cc/en/Main/Software.

Użytkownicy systemu linux Ubuntu/Mint i podobnych mogą zrobić to za pomocą polecenia:

sudo apt-get install arduino

Do naszej dyspozycji są następujące elementy:

  • arduino UNO – >6 sztuk
  • hc-sr04 (ultradźwiękowy czujnik odległości) – 6 sztuk
  • servo SG-90 – 18 sztuk
  • silniki DC – 12 sztuk
  • wyświetlacz Nokia 5110 – 6 sztuk
  • głośnik –  6 sztuk
  • potencjometry – 20 sztuk
  • fotorezystory – 12 sztuk
  • czujniki temperatury DHT-11 – 6 sztuk
  • wyświetlacze alfanumeryczne – 6 sztuk
  • pilot na IR z odbiornikiem
  • moduły nrf24l01 ( komunikacja bezprzewodowa ) – 2 sztuki
  • kompas elektroniczny
  • kompletny zestaw modułów 37 in 1 (https://tkkrlab.nl/wiki/Arduino_37_sensors)
  • diody,przyciski …
Struktura programu:
void setup(){
}
void loop(){
}
Program składa się z 2 bloków setup() i loop(). Setup() jest wykonywany tylko raz tuż po rozpoczęciu wykonywania programu. Służy głównie do definiowania funkcji poszczególnych pinów, przypisywania wartości domyślnych zmiennym wewnątrz programu oraz inicjalizacji interfejsów komunikacyjnych. Loop() wykonywany jest cały czas to wewnątrz niego znajdują się instrukcje odpowiedzialne za sterowanie urządzeniami, pinami itd.
Ekwiwalent w c:
void main(void){
     setup();
     while(1){
          loop();
     }
}
Podstawowe funkcje:
  • pinMode(numer,INPUT/OUTPUT/INPUT_PULLUP) – ustawia pin o zadanym numerze jako wejście/wyjście/wejście z podpiętym opornikiem podciągającym napięcie do 5V
  • digitalWrite(numer,HIGH/LOW)  – ustawia zadany stan logiczny na pinie HIGH 5V, LOW 0V względem masy
  • digitalRead(number) – zwraca stan logiczny true/false(0V względem masy) panujący na danym pinie
  • delay(ms) – czeka zadaną ilość milisekund
void setup(){
    pinMode(13,OUTPUT);
}
void loop(){
    delay(1000);
    digitalWrite(13,LOW);
    delay(1000);
    digitalWrite(13,HIGH);
}
  • millis() – zwraca ilość milisekund która minęła od uruchomienia Arduino
  • min(x,y), max(x,y) 
  • randomSeed(seed) – ustawia generator liczb losowych (seed to „zaczyn generatora” – jakaś losowa wartość początkowa np analogRead(0) – jeśli pin A0 nie jest do niczego podpięty)
  • random(min,max) – losowa liczba całkowita (long int) z przedziału [min,max)
  • Serial.begin(9600) – inicjuje układ odpowiedzialny za komunikację przez port szeregowy UART ( prędkość 9600 bodów / sec
  • Serial.println(„Ala ma kota”) – przesyła zadany ciąg znaków lub wartość przez UART
  • Serial.print(90) – j.w. tyle, że bez znaku końca linii
// na pinie 10 przypięty przycisk
bool lastState;
void setup(){
     lastState=false;
     pinMode(10,INPUT_PULLUP);
     Serial.begin(9600);
}
void loop(){
    if(digitalRead(10)==false){
         if(lastState==false){
              lastState=true;
              Serial.println(„Wciśnięto przycisk ;)”);
         }
    }
    else{
         lastState=false;
    }
}
  • analogRead(number) – zwraca liczbę odpowiadającą różnicy potencjałów panującej pomiędzy masą a mierzonym pinem  A<number> (0V – 0, 5V – 1023)
  • analogWrite(number,Value) – wykorzystując mechanizm PWM symuluje zadaną wartość napięcia względem masy (0V-0, 5V -255), stosować na pinach 3, 5, 6, 9, 10, 11
// LED fading
byte counter;
void setup(){
     counter=0;
     pinMode(13,OUTPUT);
}
void loop(){
     for(;counter<255;counter++){
            analogWrite(13,counter);
            delay(15);
     }
     for(;counter>0;counter–){
           analogWrite(13,counter);
           delay(15);
     }
}
  • tone(pin, frequency, duration) – generuje sygnał o zadanej częstotliwości i czasie trwania w ms na zadanym pinie(3 lub 11) ( np. do generowania dźwięku )
  • tone(pin, frequency) – j.w. tyle, że sygnał trwa do wywołania funkcji noTone(pin)
  • pulseIn(pin, LOW/HIGH, timeout[opcjonalny])  – zwraca czas trwania zadanego stanu w milisekundach
// przycisk na pinie 10
void setup(){
       Serial.begin(9600);
       pinMode(10,INPUT_PULLUP);
}
void loop(){
       int time=pulseIn(10,LOW);
       Serial.print("Przycisk wciśnięto przez czas: ");
       Serial.println(time);
} 

Schetamy podpięć typowych elementów:

Diodę podpinamy przez opornik ograniczający prąd. Prąd płynący przez diodę I_d możemy przyjąć 20mA i jest to wartość bezpieczna również dla mikrokontrolera . U_d to wartość spadku napięcia na diodzie i jest silnie zależna od koloru (1,2V – 3,6 V). Dla spadku 1,2V opór jaki należy zastosować według wzoru to 190 ohm lub większy.

Silnik DC podpinamy przez tranzystor (jeżeli podamy na pin7 stan wysoki to przez silnik będzie płynąć prąd), aby ograniczyć prąd który musi podać pin Arduino ( maksymalny wynosi 20mA, a do zasilenia silnika potrzeba zdecydowanie więcej). Dioda zabezpiecza przed chwilowym napięciem spolaryzowanym przeciwnie do zasilającego pojawiającym się na wyprowadzeniach silnika przy jego uruchamianiu i wyłączaniu wynikającym z indukcyjności jego uzwojeń.

Typical toy DC motor circuit with Arduino 

Potencjometr jest to element mechaniczny, który działa na zasadzie dzielnika napięć skrajne jego nóżki wpinamy do masy (GND) i 5V natomiast środkową do jednego z pinów oznaczonych jako Ax i odczytujemy z niego wartość napięcia za pomocą funcji analogRead(Ax) (patrz powyżej). Jest ona zależna od pozycji pokrętła/suwaka potencjometru (wzrasta liniowo lub logarytmicznie).

Głośnik możemy wpiąć w układ z wykorzystaniem opornika ograniczającego prąd tyle, że wtedy nie możemy liczyć na uzyskanie dużej głośności emitowanego dźwięku inna metoda wymaga zastosowania tranzystora tak jak miało to miejsce w przypadku silnika DC.

Przydatne biblioteki:

  • one-wire – czujnik temperatury
  • dht-11 – czujnik temperatury i wilgotności
  • IR-remote – sterowanie przy pomocy pilota
  • HMC5883 – kompas elektroniczny UWAGA 3,3V !!!