Arduino

Uit RobotMC.be
Ga naar: navigatie, zoeken

Arduino

Inleiding

Deze pagina is vooralsnog een verzameling van een aantal arduino-gerelateerde aantekeningen.

UART via Bluetooth

Arduino bluetooth.jpg

Bij het testen van een Arduino programma blijkt de seriële monitor een heel goed hulp middel.

De seriële communicatie van een Arduino UNO/NANO met een PC verloopt normaal via de UART met de pinnen "0" (RX) en "1" (TX), echter bij de Arduino is er een standaard voorziening dat seriële communicatie van de UART ook via de USB kabel kan verlopen, op de PC wordt hiervoor een virtuele comport aangemaakt. Deze situatie zal door de meeste Arduino gebruikers op deze wijze worden gebruikt. Voor het testen van je robot met de wielen op vloer is een draadloze verbinding wel handig. Dit is te realiseren met bluetooth verbinding, voor de Arduino heb je dan een bluetooth module nodig zoals bijvoorbeeld de HC-06 welke op een adapter printje JY-MCU is gemonteerd. Deze module is in China te koop bij http://www.dx.com maar ook in Nederland bij http://www.bitsandparts.eu/. De module wordt geleverd inclusief een aansluit snoertje. Echter pas op! de voeding spanning van de module is van 3,6 tot 6 volt maar voor de signalen is een 3,3 volt level nodig. Voor het TX signaal is dat geen probleem en voor het RX signaal kan dat eenvoudig worden aangepast door het signaal via een spanningsdeler (met twee weerstanden) aan te sluiten (ik heb de spanningsdeler in het aansluitsnoertje gemonteerd). De voedingsspanning pinnen worden op de Arduino aangesloten. Met AT opdrachten kan je de default waarden van de module aanpassen, ik heb de default baudrate van 9600 bps veranderd naar de 57600 bps. Als het rode ledje knippert heeft de module alleen voedingsspanning en als het ledje permanent brand dan is er een verbinding gemaakt.

Doordat de UART nu via de USB en via de aansluit pinnen is aangesloten had ik verwacht dat voor een goede werking er een schakelaar nodig was om de bluetooth module af te schakelen als de USB poort nodig is voor een nieuwe versie van het programma te uploaden. Dit schakelen blijkt niet nodig te zijn! Je kan de monitor van de Arduino IDE gebruiken om berichten via de bluetooth verbinding op het scherm te tonen net zoals dat via de USB kabel wordt gedaan maar nu draadloos via bluetooth. Mijn desktop PC heeft geen bluetooth aansluiting maar dat is met een USB bluetooth dongle op te lossen. Op internet zijn een aantal voorbeelden van de Arduino met bluetooth te vinden. Ook zijn er Aps beschikbaar voor android smartphone en tablet waarmee je niet alleen de teksten kan ontvangen maar ook opdrachten kan geven. De instructies voor het ontvangen van de opdrachten en het uitvoeren hiervan moet je wel in je programma code plaatsen, voorbeelden hiervan zijn ook beschikbaar.

IR ontvanger voor Arduino

Arduino ir receiver.jpg

Ik heb een afstandsbediening liggen waarvan ik niet wist welk protocol die gebruikt. Dus vroeg ik m'n vriend (Google) om raad en deze wist me te vertellen dat er een handige Multi Protocol library voor Arduino is. Meerdere merken en protocols worden ondersteund, zowel om te ontvangen als te zenden. Als een echte hacker, heb ik ze effe geprobeerd en inderdaad, ze werkt zoals beloofd !

#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}

Keyboard matrix

Keyboard1.jpg

Op ebay worden toetsenbordjes met 16 knopjes ('16 button matrix') aangeboden voor 1 euro. Erg handig bij het testen, maar om daar nu 8 van de schaarse IO lijnen van de Arduino Uno voor op te offeren... We kunnen natuurlijk ook de uitgang analoog maken, met een paar weerstanden. Het schema rechts toont het eenvoudige principe. Maar welke waarden moeten de weerstanden hebben om goed onderscheid te kunnen maken tussen de knopjes? En dan graag ook waarden die gangbaar zijn en je wellicht hebt liggen. De computer aan het werk gezet om uit alle combinaties uit de E12 weerstandreeks de beste te kiezen.

En de uitkomst is:

R0  2k2

R1   0E
R2 330E
R3 680E
R4  3k3

R5   0E
R6 470E
R7   1k
R8  2k2

Met de functie KeyboardGet() kun je de knopjes uitlezen. Als een knopje wordt ingedrukt, geeft deze routine het nummer van het knopje terug. Als het knopje al ingedrukt was, of als er geen knop is ingedrukt, krijg je 0 terug.

int KeyValue[] = {
  511, 547, 579, 731,
  319, 386, 444, 677,
  178, 271, 351, 645,
  0, 131, 240, 613
};

//-----------------------------------------------------------------------------
// KeyboardGet - lees keyboard (one shot)
//-----------------------------------------------------------------------------
// return:  1..16  key (one shot) 
//          0      geen (nieuwe) toets
//-----------------------------------------------------------------------------
char KeyboardGet()
{  static char KeyboardState = 0;
   static char PrevKey = -1;
           
   int Adc = analogRead(A0) - 10;
   int Key;
   for (Key=0; Key<16; Key++) {  // 17 waarden: 16 knoppen + geen 
      if (KeyValue[Key] > Adc) {
         if (KeyValue[Key] < (Adc + 20)) {
             break;
         }
      }
   }
   
   if (Key == 16) {
      // geen geldige toets
      KeyboardState = 0;
      PrevKey = -1;
      return 0;   
   }

   // Hier is een knop ingedrukt, 0..15
   
   if (KeyboardState == 0) {
      // we waren in rust
      PrevKey = Key;
      KeyboardState = 1;
      return 0;
   }            

   if (Key != PrevKey) {
      // key change => reset
      KeyboardState = 0;
      PrevKey = -1;
      return 0;         
   }

   if (KeyboardState == 1) {
      // One shot
      KeyboardState = 2;
      return Key+1;
   }       
   return 0;
}

Motorshields

LET OP

Let op: deze pagina is nog niet af en niet alles is getest. Het zijn dus echt aantekeningen en het kan zomaar zijn dat het niet klopt wat hier staat.

!!! gebruik op eigen risico !!!

Terugkoppeling wordt zeer gewaardeerd.

(Joep)

Motor Shield Rev 3

Motorshield rev3.jpg

http://arduino.cc/en/Main/ArduinoMotorShieldR3

Het Arduino 'Motor Shield Rev 3' is gebaseerd op de L298 H-brug. Dit shield heeft een aantal extra's ten opzichte van de voorgaande versies met dezelfde chip, zoals het DFRobot Motor shield.

  • meting van de motor stroom
  • gewijzigde aansturing met rem (break) optie.
  • een aantal extra connectoren

Aansturing op enable

Helaas gaat het ontwerp van het Rev3 motor shield uit van pwm op de enable ingang. Bij dese aansturing is snelheid van de motor niet linear en sterk afhankelijk van de belasting van de motor.

Bij deze aansturing worden de pinnen als volgt gebruikt:

  • D8/D9 = break (laag = disable)
  • D11/D3 = Pwm
  • D13/12 = Direction / richting

Harde aansturing

Het goede nieuws is dat dit shield met 1 jumper wire geschikt is voor harde aansturing.

Let op: met deze wijze van aansturen gaat het stroomverbruik omhoog. Met dit shield en deze methode kunnen motoren worden aangestuurd met een stall current tot 2A.

Bij deze aansturing worden de pinnen als volgt gebruikt:

  • D10/D9 = Pwm
  • D11/D3 = Enable (hoog)
  • D13/12 = Direction / richting
  • D10 en D8 doorverbinden met jumper wire.

Opmerkingen:

  • Voor harde aansturing hebben we PWM nodig op pin D8 van het motorshield. Echter, pin D8 (van de Arduino Uno) ondersteunt geen PWM. We gebruiken daarom de Arduino Uno PWM functie van pin D10. Met een jumper wire wordt D10 met D8 doorverbonden, zodat het PWM signaal met de juiste pin van het motor shield wordt verbonden. Pin D8 van de Arduino Uno kan hierdoor niet gebruikt worden voor andere doeleinden en dient op input te blijven staan.
  • De PWM waarde is afhankelijk van de rijrichting. Bij voorwaarts (D13 / D12 laag) wordt de normale PWM waarde gebruikt, bij achteruit dient deze met -1 te worden vermenigvuldigd.

Zie de pagina Arduino Motorshield Rev3 voor de code.

DFRobot motor shield

Motorshield dfrobot.jpg

http://www.dfrobot.com/index.php?route=product/product&product_id=69

Het DFRobot motor shield is een voorbeeld van de veel verkrijgbare (een vaak aanzienlijk goedkoper) voorgaande versie van het motor shield.

Aansturing op enable

Ook dit bord wordt standaard op enable aangestuurd. Hiervoor worden niet dezelfde pinnen gebruikt als bij het Rev3 motor shield. Er zijn een tweetal opties, die via het jumper blok geselecteerd kunnen worden.

De enable aansturing van het bord kan als volgt pin compatible worden gemaakt met het Rev3 shield:

  • verwijder alle jumpers
  • verbind pin M1 van het jumper blok (shield zijde) met D12 van de arduino.
  • verbind pin M2 van het jumper blok (shield zijde) met D13 van de arduino.
  • verbind pin E1 van het jumper blok (shield zijde) met D3 van de arduino.
  • verbind pin E2 van het jumper blok (shield zijde) met D11 van de arduino.

Harde aansturing

Het motor shield kan geschikt gemaakt worden voor 'harde' aansturing. Het kan dan niet meer op de oude manier gebruikt worden. Er worden geen baantjes onderbroken met deze methode.

Stappen:

  • verwijder alle jumpers
  • verwijder de 74hc00 (14 pin SMD chip aan de rand van het shield) (1)
  • verbind de pinnen E1 en E2 van het jumper blok aan de kant van het shield met +5V. De enable van de H-brug is zo continue ingeschakeld. (2)
  • verbind pin M1 van het jumper blok (shield zijde) met D12 van de arduino. (dit signaal komt terug op pin 9 & 10 van de 74hc00)
  • verbind pin M2 van het jumper blok (shield zijde) met D13 van de arduino. (dit signaal komt terug op pin 12 & 13 van de 74hc00)
  • verbind pin 8 en 9 van de 74hc00 met een druppeltje soldeertin. (dit koppelt M1 aan Input1 van de L298)
  • verbind pin 11 en 12 van de 74hc00 met een druppeltje soldeertin. (dit koppelt M2 aan Input3 van de L298)
  • verbind pin 6 van de 74hc00 met D9 van de arduino (Input2 van de L298)
  • verbind pin 3 van de 74hc00 met D10 van de arduino (Input4 van de L298)

(1) ruim soldeertin toevoegen aan iedere zijde, iedere zijde om de beurt warm maken en met een kleine schroevendraaier de chip iets omhoog duwen. Na een keer of 10 afwisselen komt de chip voldoende los. (2) desgewenst kunnen deze pinnen - tezamen of los - met vrij pinnen op het shield worden verbonden.

Na deze aanpassing worden de pinnen als volgt gebruikt:

  • D10/D9 = Pwm
  • D13/12 = Direction / richting

Opmerking:

  • Ook hier is de Pwm waarde afhankelijk van de rijrichting; dit is echter omgedraaid ten opzichte van de aansturing van het Rev3 shield.

L298 (harde aansturing)

L298 Module.jpg

De L298 is verkrijgbaar als losse chip, maar (voor ongeveer dezelfde prijs) ook als module. Zo'n module bevat, naast de L298 chip, ook de beveiligingsdiodes en een 5V regulator voor de voeding van de digitale logica van de L298. De 4 ingangen van de L298 en de 2 enable signalen zijn uitgevoerd op een header. De enable signalen kunnen d.m.v. een jumper vast hoog (ingeschakeld) gemaakt worden.

Een L298 kan als volgt worden aangesloten:

  • Input1 van de L298 aan D12 van de Arduino
  • Input2 van de L298 aan D9 van de Arduino
  • Input3 van de L298 aan D13 van de Arduino
  • Input4 van de L298 aan D10 van de Arduino
  • Enable_A van de L298 aan +5V
  • Enable_B van de L298 aan +5V

Na deze aanpassing worden de pinnen als volgt gebruikt:

  • D10/D9 = Pwm
  • D13/12 = Direction / richting

Dit is gelijk aan het dfrobot shield na ombouw voor harde aansturing.