tiistai 20. maaliskuuta 2018

Leikkiminen Arduinojen ja micro:bitien kanssa jatkuu...

Tänään paneuduin pitkästä aikaa virtapiirien kytkentäkuvien piirtämiseen ja huomasin, että aikaisemmin käyttämäni circuits.io:n Electronics Lab olikin vaihtunut Tinkercad:ksi. No, hyvin näytti tämänkin toimivan. Koodi oli helppoa tehdä blokkieditorilla ja simulointi toimi mainiosti. Uutta oli myös se, että johtimet sai piirrettyä hienosti kaareviksi. Simuloinnin lisäksi koodin saa myös ladattua omalle koneelle ArduinoCC-tiedostona! Eipä hullumpaa.

Tässä ensimmäinen kokeiluni, servomoottorin ohjaaminen potentiometrillä. Simulaation käynnistämisen jälkeen tartu hiirellä potentiometriin ja liikuttele sitä niin saat servon kääntymään. Jos haluat tutkia koodia, sen saa näkyviin valitsemalla "Code".


Tinkercadillä piirretty kytkentäkuva servomoottorin ohjaamisesta potentiometrillä 

Tinkercadillä voi myös ohjelmoida ja ladata koodin ArduinoCC-tiedostona
Tämän näköistä koodia tästä generoitui:

#include <Servo.h>

Servo servo_3;

void setup()
{
  pinMode(A0, INPUT);
  servo_3.attach(3);

}

void loop()
{
  servo_3.write(map(analogRead(A0), 0, 1023, 0, 180));
  delay(100); // Wait for 100 millisecond(s)
}

Tässä vielä kuva kytkennästä:

Arduino kytkettynä potentiometriin ja servomoottorin
Vastaava toiminta micro:bit:illä ei toiminut aivan näin hyvin. Simulaatioon ei voi itse lisätä komponentteja, servo kyllä ilmestyy siihen automaattisesti kun koodiin valitsee servoblokin, potentiometriä ei voi lisätä mutta sitä voi mallintaa klikkailemalla P1-pinniä. Ensimmäinen versio koodista ei toiminut. Ilmeisesti vika on siinä, että koska JSBlocks ei tue liukulukuja jakolasku pyöristyy nollaksi... 

Hyvältä näyttää mutta ei toimi...

Kun laskujärjestyksen muuttaa niin, että kertolasku suoritetaan ensin, homma lähtee toimimaan. Aika kinkkistä...

Tämä versio koodista toimii 

Tässä linkki projektiin. Microbit:iin ladattuna koodi ei kuitenkaan toimi yhtä hyvin kuin Arduino:ssa, servo pörisi ja nyki epäilyttävästi. Tämä johtuu micro:bit:in alemmasta käyttöjännitteestä (Arduino 5V, micro:bit 3,3V). 

Tässä vielä vertailun vuoksi sama koodi ohjelmoituna C++:lla ja mbed:llä:

#include "MicroBit.h"

MicroBit uBit;

int main()
{
    uBit.init();
    
    while(1){
    int potikka = uBit.io.P1.getAnalogValue(); //P1: 0-1024 
    int moottori = (int(potikka/1024.0*180));
    uBit.io.P0.setAnalogValue(moottori);  //P0: 0-180    
    uBit.sleep(10);
    }
}

Myös mbed:llä ohjelmoidessa kokonaislukujen jakolaskun kanssa pitää olla tarkkana ja muistaa muuttaa ainakin toinen liukuluvuksi (vrt. 1024.0 yllä olevassa koodissa) ettei tulos pyöristy tässäkin nollaan. 

Tämän kytkennän sai toimimaan ilman kondensaattoria Arduinon kanssa mutta micro:bit:illä ei (moottori jämähti välillä paikoilleen). Kondensaattorin tarkoitus on tässä tasailla moottorin käynnistämisen aiheuttamia virtapiikkejä, ja ilmeisesti alemmalla käyttöjännitteellä tasaaminen auttaa pitämään moottorin käynnissä paremmin. micro:bit:in kanssa pitäisi ilmeisestikin käyttää ulkoista jännitelähdettä servolle, ja se taas johtaisi paljon monimutkaisempaan kytkentään...

micro:bit kytkettynä potentiometriin ja servomoottoriin

Ei kommentteja:

Lähetä kommentti