<<

#287 ; Seria komunikado inter RPi kaj Arduino Uno

>>

Interesa temo estas seria komunikado inter Raspberry Pi (mallongigo RPi) karta mikrokomputilo kaj Arduino Uno mikroregila karto, ekzemple tra USB-konekto kion la suba bildo klarbildigas. Ekzistas tre bona informo pri tio en la komputila reto, sed bedaŭrinde nur en angla lingvo.

La plej simpla metodo por programi Arduino certe estas trans USB-kablo. Oni povas uzi PC/Windows por programadi la mikroregilon Arduino Uno, sed same bone oni povas uzi Raspberry Pi anstataŭ PC.

RPi ja estas tute honesta komputilo - malgraŭ la malgrandeco de karto - kaj eblas ĝin uzi per klavaro kaj ekrano.

Ekzistas libere haveblaj programoj por ambaŭ komputilaj sistemoj PC kaj RPi por programadi Arduino. Nur unu programo pofoje povas ekzisti en memoro de Arduino sed RPi ja estas kompleta komputila sistemo. Arduino estas por plenumi unu relative simplan taskon. Raspberry Pi estas granda kaj komplika sistemo kun tre multaj eblecoj.

USB-kablo samtempe proponas elektran energion por Arduino tiel ke ĝi ne bezonas alian energian fonton. Arduino konsumas nur malmulte da elektro. Certe oni norme povas uzi Arduino ankaŭ sole - kun sia propra energia fonto - kiam la programo estas preta, se oni ne bezonas la komputilon RPi dum la programo funkcias.

Ankaŭ nia kara RPi ja havas liberaj GPIO-najletoj por rekta I/O (angle "Input/Output"). Do eble vi volus demandi kial ni ne uzu rekte nur RPi kion ni ĉiuokaze bezonas, kial uzu Arduino kun RPi? Kion plian avantaĝon Arduino ofertas?

Nu, kelkaj kartoj ekzistas nur por Arduino kaj ĝi estas la pli malmultekosta karto por riski. Arduino estas bona por relative simplaj taskoj kioj devas progresi certe kaj konstante. Neeviteble ekzistas riskoj en propra elektra konektado. La karto eble difektiĝas ekzemple pro troa elektra kargo kaj povas eĉ perei. Se okazus malutilo, prefere la detruita karto estu la simpla Arduino ol la pli kara RPi. Se la plej grava cirkvito de Arduino estas sur bazo kaj tial facile interŝanĝebla, estas la malutilo tamen ne tre granda.

Oni uzu konvenan fortigilon se la kargo bezonas pli ol proksimume 10 mA da elektra kurento. Se la kargo produktas danĝeraj tensiaj pintoj, oni bone protektu la sentemajn kartojn kontraŭ ili. Grandaj bobenoj ĝenerale povas esti danĝeraj por sentemaj cirkvitoj pro la altaj tensioj kiujn ili povas produkti en ŝaltilaj situacioj.

Alternative oni povus uzi la GPIO-najletoj por komunikadi inter RPi kaj Arduino, kiel la dekstra bildo montras, anstataŭ la norma USB-kablo. Do 4 konduktiloj inter la kartoj. Klare la kartoj en tio kazo bezonas la komunan elektran teron Ground kaj Arduino bezonas uzan tension +3,3V / +5V el RPi. Oni uzas ankaŭ du signaloj el GPIO -konektilo: TXD0 kaj RXD0 por sendi kaj ricevi informon inter la kartoj. Mi tamen simple preferas norman USB-kablon. Ekzistas ja multe da liberaj USB-konektiloj en RPi, do nenia manko.

Ni jam iom pritraktis la programadon de Arduino el PC/Windows aŭ RPi -sistemo, sed la vera temo de ĉi tiu artikolo estas iom alia: Kiel komunikadi inter RPi kaj Arduino dum programo trans seria protokolo. Do la programo estas jam aktiva en ambaŭ kartoj kaj ni volas ke la kartoj interkomunikadi dum programo, aŭtomate.

Certe ni bezonas skribi apartan programon por ambaŭ kartoj por ke ili kapablu interkomunikadi unu kun la alia. Mi ankoraŭ ne provis ĉi tion mem en praktiko, sed mi kredas ke la sekvanta povus funkcii. Estas kurtaj kaj simplaj ekzemploj el io finna libro "Sulautetut". Por la simpla C/C++ sistemo de Arduino ni skribas:

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.print("F ");
  delay(500);
  Serial.print("B ");
  delay(1000);
  Serial.print("FFFF");
  delay(500);
  Serial.print("http://sulautetut.fi");
  delay(2000);
}

Do en la ekzemplo Arduino nur sendas tekston por RPi. La rapido de seria komunikado estas 115200 bps.

Por RPi la ekzemplaj Python -programoj por simpla komunikado estas (se ni uzas USB1 en RPi):

#!/usr/bin/env python
# readSerial.py
import serial, sys
ser = serial.Serial("/dev/ttyUSB1", 115200)
if (ser):
  print ("Serial port " + ser.portstr + " opened.")
while True:
  sys.stdout.write(ser.read(1))
kaj
#!/usr/bin/env python
# gtkSerial.py
import serial, gtk, gobject, sys
ser = serial.Serial('/dev/ttyUSB1', 115200)
def pollSerial():
  sys.stdout.write(ser.read(1))
  return True
if(ser):
  print ("Serial port " + ser.portstr + " opened.")
  gobject.timeout_add(100, pollSerial)

gtk.main()

Oni tamen bezonas unue aparte pretigi la RPi-sistemon por seria komunikado. Oni nome bezonas PySerial -programan libraron.

sudo software-properties-gtk -enable-component=universe
sudo apt-get update

sudo apt-get install python-serial

Povas tamen esti ke la programoj de libro por RPi fakte estas por Ubuntu kaj ne por la propra Debian -bazita sistemo kion mi preferas?


En io teksto mi vidis klarigon ke estus sufiĉe ( almenaŭ se oni samtempe uzas ankaŭ Apache-Webserver kaj Firebase ) por la pi -uzanto se oni skribas novan datumon /etc/udev/rules.d/55-odd.rules kio havas la sekvantan vicon de teksto kiel enhavo: KERNEL=="ttyACM0", SYMLINK+="ttyS7"

Kaj oni plenumas la sekvantan komandon por aldoni uzanton pi al grupo dialout :

sudo usermod -a -G dialout pi

Tiam oni eble povus en programo uzi la esprimon ser same kiel en la supra programo, kie portti kredeble estas la menciita distingilo de pordego ttyACM0 , simila al ttyUSB1 en la supra programa esprimo '/dev/ttyUSB1' , depende de pordego kion oni volas uzi ):

ser = serial.Serial('/dev/portti', 9600, timeout=0)

Sed mi ankoraŭ ne testis tion mem kaj tial ne scias ĉu vere funkcias en norma Raspberry Pi.

Pli da informo pri tio. Nu, retrospektive aperas ke oni bezonas fari por la norma RPi iom pli ol kion mi supre skribis ... ni pli bone legu la tutan informon!


Klare oni povus esperi pli da informo en la supre menciita reta adreso http://sulautetut.fi sed la teksto estas plejparte en la finna lingvo. Ĉioj programoj de libro tamen kredeble estas haveblaj tie en unu kompakta datumo en pakita .zip -formato.

Jes, eble mi tion provos ion belan tagon, kun multe da batalado, se mi vere volas ke RPi kaj Arduino Uno nepre kunlaboru dum programo tiel ke moviĝas mallongaj sciigoj inter ili?

Kaj certe fine .......... NI VENKOS!

La Ambasadoro en Pori
de sendependa nacio
Mueleja Insulo


Menuo
Ĉefa paĝo (finna lingvo)