Arduino
Arduino
Inleiding
Deze pagina is vooralsnog een verzameling van een aantal arduino-gerelateerde aantekeningen.
UART via Bluetooth
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
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
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
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
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)
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.