PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Neuartiger (?) Roboter mit MicroPython als Betriebssystem



barbar
20.02.2016, 13:52
Hallo Forum, nach langer, arbeitslastbedingter Forumsabwesenheit versuche ich ab heute rund eine Stunde/Tag in die Entwicklung eines Roboters zu investieren und hier darüber zu berichten. Dabei verfolge ich folgende

Ziele
1. Umsetzung der Idee eines Roboters der Spezies "landgängiger Kopffüßer" (Robot Geocephalopoda?) :-)

2. Einfaches Konzept, schnelle Ergebnisse.

3. Python lernen (Bisher habe ich nur gelegentlich fremde Python-Codeschnipsel wiederverwendet. Ich bin also Anfänger).

4. Interesse an MicroPython wecken. MicroPython ist frei und quelloffen (FOSS). Siehe hier: https://github.com/micropython/micropython#the-micropython-project
Es enthält eine stattliche Teilmenge der interpretierten Programmiersprache Python - speziell für Mikrocontroller entwickelt. (Ich finde es sehr gut, dass man interaktiv mit dem Roboter sprechen/testen/debuggen kann, keine Toolchain benötigt bzw. nichts kompilieren muss).

Umsetzung

So, genug Vorrede. Es geht los. Der Komponentenhaufen sieht vorläufig wie folgt aus:

31320
Bildinhalt


STM32F4-Microcontrollerboard (hier ein etwas teureres PyBoard ca. 25 EUR, günstiger wäre STM32F4-Discovery ab ca. 15 EUR. Oder in Kürze* ein ESP8266-Board ab ca. 10 EUR oder noch weniger)
Zwei Miniservos (je ca. 5 EUR)
USB-Powerbank 1000mAh (ca. 3 EUR)
Breadboard in Miniausführung (ca. 2 EUR)
Sharp Distanz-Sensor GP2D120 bzw. GP2Y0A21 (ca. 9 EUR)
Piezo-Signalgeber Rmp-14p/Hat (ca. 1,50 EUR)
Stiftleisten
Doppelseitiges Klebeband/Montageband
Isolierband/PVC


Als nächstes sollte wohl überprüft werden, ob das Controllerboard funktioniert.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar



* Hinweis: Seit etwa drei Wochen läuft eine bereits mehrfach überzeichnete Geldsammelaktion https://www.kickstarter.com/projects/214379695/micropython-on-the-esp8266-beautifully-easy-iot. Ziel ist es, MicroPython auf den beliebten/billigen WLAN-Chip ESP8266 zu bringen. MicroPython für ESP8266 wird in etwa zwei Wochen in Erstfassung vorliegen. Gute ESP8266-Boards sind ab etwa 10 EUR erhältlich!

barbar
21.02.2016, 10:18
Es folgt eine kurze

Funktionsprüfung des Controllerboards:

1. Das Board verbinde ich mit dem PC mittels USB-Kabel (Micro-B zu Typ-A Stecker). Die USB-Verbindung ist hier sowohl für die Stromversorgung des Boards als auch für die Kommunikation zuständig.

2. Die gelbe LED des Boards blitzt kurz auf (gut!).

3. Auf meinem Linux-PC werfe ich meine lieblings Terminal-Emulation an: picocom.
Hinweis: Wer mit Windows arbeitet, kann z.B. PuTTY (putty.exe) einsetzen, muss zuvor aber Treiber installieren. Bei Mac OS X funktioniert es wie bei Linux "out of the box".


4. Nachdem die Verbindung zum Board steht, sieht mein Terminal Fenster wie folgt aus:

31322

Auf dem Bild ist zu sehen, dass man, nachdem die Terminal-Emulation gestartet ist, direkt im Python-Prompt landet. Das Board hat den ersten Eignungstest aus meiner Sicht bestanden.

Als nächstes werden die Stiftleisten an das Board gelötet und kleine Peripherietests mit dem Piezo-Signalgeber und mit einem Servo unternommen. Zuvor "beantrage" ich noch ein Youtube-Konto :cool:

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

barbar
21.02.2016, 12:46
Um keine Langeweile aufkommen zu lassen während ich die Stiftleisten anlöte, verlinke ich als Zwischeninformation für eventuell Interessierte auf die Kurzreferenz des hier verwendeten Controllerboards (pyboard PYBv1.0):

31323
http://docs.micropython.org/en/latest/pyboard/quickref.html


Übrigens werden häufig Buchsenleisten an Stelle von Stiftleisten angebracht:

31324
https://micropython.org/doc/tut-servo

Mir passt das aber nicht so recht ins Konzept.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

barbar
21.02.2016, 16:28
So, die Stiftleisten sind angelötet.

31326

Diese Anordnung der Stiftleisten ist deshalb ausgewählt, damit

1. das Controllerboard auf das kleine Steckbrett passt und

2. zugleich die Servo-Pins nach oben frei zugänglich sind.

31328
Bei dem kleinen Steckbrett muss Bestückung bzw. Verdrahtung unterhalb des Controllerboards wegen Überbreite desselben erfolgen :rolleyes:

3. Außerdem lässt sich bei dieser Stiftleistenanordnung gut auf der Powerbank herumreiten :cool:

31329


Als nächstes wird ein Servo am Board getestet.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

barbar
22.02.2016, 17:14
Der Servotest ist erfolgreich abgeschlossen.

Code sieht wie folgt aus:


def bewegen():

import pyb
servox = pyb.Servo(4)

while True:
for i in range(70, -70, -1):
print(i)
servox.angle(i)
pyb.delay(10)
for i in range(-70, 70, 1):
servox.angle(i)
print(i)
pyb.delay(10)


Und es bewegt sich etwas:

https://youtu.be/JoGtijHsEzc

Die Videoqualität ist katastrophal - bitte entschuldigt!
[Erste youtube-"Produktion". Gefilmt mit Telefon (Flame mit Firefox OS). Muss jetzt etwa bessere Kamera her? §@#$€!]

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

barbar
23.02.2016, 16:49
Heute stand das akustische Organ des zukünftigen Roboters auf dem Stundenplan.

An den Piezo Signalgeber habe ich zunächst etwas stärkere Kupferdrähte angelötet, damit das Teil nicht herumhängt. Dann wurde angeschlossen ...

31342

31343

... und anschließend so lange geübt, bis das Pfeifen klang, wie es sollte:


https://youtu.be/TBrJSGHhRPg
[Nicht nur Bild, sondern auch Ton sind stark verbesserungsfähig: Zu leise! Mikrofon auf kameraabgewandter Seite des Telefons #@§! Naja, darauf gepfiffen!]


Der zugehörige Python-Code sieht so aus:


def pfeifen():

import pyb
piezo = pyb.Pin(pyb.Pin.board.Y12, pyb.Pin.OUT_PP)
led = pyb.LED(4)

for t in range(5):

print('Pfiff',t)

for i in range(600, 10, -1):
piezo.value(1)
pyb.udelay(i)
piezo.value(0)
led.intensity(i)
pyb.delay(200)
for i in range(600, 10, -1):
piezo.value(1)
pyb.udelay(i)
piezo.value(0)
led.intensity(i)
for i in range(10, 1200, 1):
piezo.value(1)
pyb.udelay(i)
piezo.value(0)
led.intensity(i)
led.off()
pyb.delay(1000)

Die blaue Controllerboard-LED wurde "mitgenommen", damit man im Video auch sieht, wann gepfiffen wird :rolleyes:


Als Nächstes ist die Optik an der Reihe.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

barbar
24.02.2016, 12:02
Leider habe ich heute wenig Zeit. Deshalb dokumentiere ich nur kurz den neuesten Stand:

31346

Auf dem Bild ist der Versuchsaufbau für den Distanz-Sensor zu erkennen. Der Sensor ist mit doppelseitigem Klebeband auf dem Servo angebracht. Zugleich wird hiermit ein erster Ansatz des Roboterkopfs präsentiert.

Mit folgendem Code wird der Distanz-Sensor geprüft:


def sehen():

import pyb
irsinn = pyb.ADC(pyb.Pin.board.X1)

while True:
print(irsinn.read())
pyb.delay(20)

Testergebnisse bleibe ich bis morgen schuldig.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

morob
24.02.2016, 12:16
schicke arbeit, ich guck mal zu

Rabenauge
25.02.2016, 10:11
Bist du sicher, dass das Board (ich hab gerade mal Infos gesucht, die Stromversorgung scheint auf max 300mA ausgelegt zu sein) die Servoströme wirklich verkraftet?
Gerade diese Miniservos sind mitunter erstaunlich stromhungrig, die ziehen teilweise schon ohne Last mal eben 700mA....wenn du Glück hast, läuft es einfach nur langsamer, aber das kann auch ganz andere Nebenwirkungen mit sich bringen (Controller resettet, weil die Spannung einbricht oder irgend was geht in Rauch auf).

barbar
25.02.2016, 14:39
@morob: Danke für Zuspruch. Aktive Zuschauer führen womöglich zu sorgfältigerer Arbeit ;-).

@Rabenauge: Danke für Frage bzw. Hinweis. Nein, sicher bin ich nicht. Habe jedoch, ohne Anomalien festzustellen, bereits zwei Servos testweise gleichzeitig in Funktion gehabt (allerdings im Batteriebetrieb, da ich mir über den USB-Port am Notebook Sorgen gemacht habe). Darf ich nach der Quelle für die 300mA Fragen? Ich ging bisher von Absatz 4 dieser Anleitung aus: https://micropython.org/doc/tut-servo. Ihrzufolge verkraftet das Board mindestens 4 kleine bis mittlere Servos.

Gruß
/barbar

barbar
25.02.2016, 17:03
Zunächst möchte ich das gestrige Testergebnis als Video in gewohnt mäßiger Qualität nachliefern:


https://youtu.be/tub-Pfo1CDU

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

morob
25.02.2016, 19:51
er hat recht mit den servos, solange diese keine belastung haben alles ok. unter belsatung wird es ausfälle geben,
du mußt auch die stromversorung abblocken mit kondensator.
am besten zwei stromkreise mit einer masse, elektronik und servos.

du kannst doch die servos an x1 bis x4 anschliessen, dann hast du ground und v+ dahinter. ich bin mir nicht sicher ob du die servos richtig angeschlossen hast.
...
The power pin for the servos (labelled VIN) is connected directly to the input power source of the pyboard. When powered via USB, VIN is powered through a diode by the 5V USB power line. Connect to USB, the pyboard can power at least 4 small to medium sized servo motors.
If using a battery to power the pyboard and run servo motors, make sure it is not greater than 6V, since this is the maximum voltage most servo motors can take. (Some motors take only up to 4.8V, so check what type you are using.)
...

barbar
26.02.2016, 17:23
... du kannst doch die servos an x1 bis x4 anschliessen, dann hast du ground und v+ dahinter. Genau! Ich hatte gehofft, das sieht man auf den betreffenden Bildern (und der weiter oben verlinkten Kurzreferenz des Boards). Gruß /barbar

barbar
26.02.2016, 19:46
Es folgt ein kurzer Zwischenbericht aus der Mechanik.

Heute war ich beim Baumarkt und habe ein hartes/steifes Kunststoffprofil 20x20x1,5 mm gekauft. Danach war ich beim Schlosser und habe den vor einiger Zeit bestellten Federstahldraht abgeholt:

31373

Beim Federstahldraht handelt es sich um Meterstücke in den Stärken 1,0 mm, 1,5 mm und 2,0 mm. Die verschiedenen Stärken habe ich aus Unsicherheit über Beanspruchung bzw. Durchbiegung bestellt. Jetzt, da ich sie in der Hand halte, werde ich mich wohl auf Verwendung der Stärke 1,0 mm beschränken.

Mit zwei Zangen habe ich ein ca. 24 cm langes Stück in Form gebracht:

31374

Es ist hoffentlich nicht schwer zu erraten, dass es sich um Füße handelt:

31375

Beim nächsten Mal kümmere ich mich wieder etwas mehr um Softwareanforderungen, denn eigentlich war die heutige Fußarbeit :) etwas verfrüht.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

barbar
27.02.2016, 14:53
So, die Füße sind mittels PVC-Tape am Servo angebracht:

31377

Man sieht im Hintergrund, dass der Charakterkopf des Roboters an Kontur gewinnt :-). Im Vordergrund ist zu sehen, dass ich ein Stück aus dem Kunststoff-Winkelprofil zurechtgeschnitten und zusammen mit einem Servohorn mit Kontaktkleber versehen habe.

Nach Verklebung und Montage sieht der neue Versuchsaufbau wie folgt aus:

31378

Als nächstes, planmäßig heute gegen Abend, folgt ein kurzer Bericht mitsamt Python-Code und eventuellem Video über das Zusammenwirken zwischen Distanzerkennung und akustischer Signalisierung.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

barbar
27.02.2016, 17:39
Heute Nachmittag bestand meine Aufgabe darin, auf möglichst einfache Weise eine gemessene Distanz als Tonsignal auszugeben. Nach zwei Stunden Experimentierens ist folgendes dabei herausgekommen:



http://www.youtube.com/watch?v=9KLV8Aopk2A

https://youtu.be/9KLV8Aopk2A [Der Ton ist wegen abseitigem Telefonmikro sehr leise. Sorry!]

Der zugehörige Python-Code sieht wie folgt aus:




buzzer = pyb.Pin(pyb.Pin.board.Y12, pyb.Pin.OUT_PP)
irsinn = pyb.ADC(pyb.Pin.board.X1)

def beep(lev,dur): # lev=tick-pause/ton-hoehe, dur=tick-anzahl/ton-dauer
for i in range(dur):
buzzer.value(1)
pyb.udelay(lev)
buzzer.value(0)

def detect():
while True:
lev = irsinn.read()
beep(lev,200)
print(lev)
pyb.delay(50)


Beim nächsten Mal erfolgt Distanzmessung mit Kopfdrehung.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

barbar
28.02.2016, 12:37
Und wieder zunächst ein kurzer Ausflug in die Mechanik. Mir war gerade danach, den Kopf des Geocephalopoden :cool: fertigzustellen.

Dazu habe ich in den bereits verwendeten Kunststoffwinkel mittels Taschenmesser ein Loch gebohrt:

31387

Das Loch ist notwendig, damit das angeklebte Servohorn ...

31388

... noch in sein Servo eingeschraubt werden kann:

3138931390

Den Kopf betrachte ich als planmäßig fertiggestellt. Er ist auf seinem Prüfstand befestigt, damit die Tests zur Beweglichkeit und Distanzmessung, die heute Abend im Zeitfenster 18:00 - 18:30 Uhr stattzufinden haben, unverzüglich beginnen können. Was ein Stress :).

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

morob
28.02.2016, 17:44
Genau! Ich hatte gehofft, das sieht man auf den betreffenden Bildern (und der weiter oben verlinkten Kurzreferenz des Boards). Gruß /barbar


lt beschreibung soll das so sein.

barbar
28.02.2016, 18:14
Wegen Zeitmangel möchte ich hiermit nur kurz das Ergebnis der heutigen Tests per Video präsentieren:


https://www.youtube.com/watch?v=9vvX9morAf0

https://youtu.be/9vvX9morAf0

Python-Code und weitere Schritte muss ich für morgen schuldig bleiben.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

morob
28.02.2016, 19:43
alles schick, aber rom wurde auch nicht an einem tag erbaut. :D

barbar
29.02.2016, 13:42
alles schick, aber rom wurde auch nicht an einem tag erbaut. :D
jaja, ich weiss, bin zu langsam:)

- - - Aktualisiert - - -

Zur Sache: Hier der MicroPython-Code, der für den gestrigen Videoinhalt verantwortlich war:



# tests pyb-geocephalopod-robot

buzzer = pyb.Pin(pyb.Pin.board.Y12, pyb.Pin.OUT_PP)
servox = pyb.Servo(4)
servoy = pyb.Servo(3)
irsens = pyb.ADC(pyb.Pin.board.X1)

def lookndetect():
servox.angle(0) # calibrate
servoy.angle(0) # calibrate
for i in range(0, 70, 1):
servox.angle(i)
lev = irsens.read()
print(lev)
beep(lev,100)
for i in range(70, 0, -1):
servox.angle(i)
lev = irsens.read()
print(lev)
beep(lev,100)
for i in range(0, -70, -1):
servox.angle(i)
lev = irsens.read()
print(lev)
beep(lev,100)
for i in range(-70, 0, 1):
servox.angle(i)
lev = irsens.read()
print(lev)
beep(lev,100)

def beep(lev,dur):
for i in range(dur):
buzzer.value(1)
pyb.udelay(lev)
buzzer.value(0)

def whistle_call():
for i in range(300, 10, -1):
buzzer.value(1)
pyb.udelay(i)
buzzer.value(0)
for i in range(10, 700, 1):
buzzer.value(1)
pyb.udelay(i)
buzzer.value(0)
for i in range(700, 10, -2):
buzzer.value(1)
pyb.udelay(i)
buzzer.value(0)

def sleep():
servox.angle(0) # calibrate
servoy.angle(0) # calibrate
for i in range(10):
pyb.LED(4).on()
pyb.delay(10)
pyb.LED(4).off()
pyb.delay(90)

def step_r(): # step right
servoy.angle(0, 100)
servox.angle(0, 100)
servox.angle(-70, 100)
pyb.delay(200)
servoy.angle(-20, 100)
pyb.delay(300)
servox.angle(40, 1000)
pyb.delay(1000)
servoy.angle(0, 100)

def step_l(): # step left
servoy.angle(0, 100)
servox.angle(0, 100)
servox.angle(70, 100)
pyb.delay(200)
servoy.angle(20, 100)
pyb.delay(300)
servox.angle(-40, 1000)
pyb.delay(1000)
servoy.angle(0, 100)

def go():
for i in range(2): # 2 steps
lookndetect()
step_r()
step_l()

try:
whistle_call()
whistle_call()
switch = pyb.Switch()
switch.callback(lambda:go())

except:
sleep()


Heute abend findet die Hochzeit statt, damit meine ich die Vereinigung von Kopf, Controllerboard und Energiespeicher.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

barbar
01.03.2016, 11:59
Hier liefere ich die Hochzeitsbilder.

Kurz zuvor:

31396

Und kurz danach:

31397

Sprachorgan und Gestell :confused: (Prototyp im Hintergrund) waren noch nicht montiert, folgten jedoch alsbald.

Wir üben jedenfalls gerade das Vorwärtskommen miteinander und berichten in Code und Video heute Abend.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

barbar
01.03.2016, 17:33
Erste Schritte in der realen Welt

Wie in vorangegangner Meldung angekündigt, haben wir heute Abend die Vorwärtsbewegung geübt. Anfangs lief alles gut. Dann agierte der Geocephalopode plötzlich leider kopflos:


https://www.youtube.com/watch?v=fyHgIPhzjI4

https://youtu.be/fyHgIPhzjI4

Wir kleben ihn morgen früh wieder zusammen und üben weiter.

Anregungen oder Fragen?
Demnächst mehr.
Gruß
/barbar

Rabenauge
01.03.2016, 23:31
Schaut doch schon recht nett aus.
Mit etwas anders gebogenen Beinen würd es bestimmt weit besser funktionieren, wenn der Schwerpunkt gut gewählt ist könnt sie sogar fast richtig laufen:
https://www.youtube.com/watch?v=qKRCubhYs0Y
Besser geht es so: https://www.youtube.com/watch?v=F8VpHYndgmE

Hm-wenn ich zufällig noch nen 5V-ProMini rumliegen hätte....eigentlich ganz nett. So nen Sharp-Sensor wäre auch da.

barbar
02.03.2016, 08:01
Schaut doch schon recht nett aus. Mit etwas anders gebogenen Beinen würd es bestimmt weit besser funktionieren, wenn der Schwerpunkt gut gewählt ist könnt sie sogar fast richtig laufen Ja, korrekt. Man müsste anders bauen/anordnen, wenn Gehen bzw. Laufen Priorität wäre.

Meine Priorität ist Multifunktionalität (und freie Beweglichkeit) des Kopfes, der im Endzustand an Stelle eines IR-Sensors (oder zusätzlich zu diesem) eine Kamera tragen wird. Daher das Konzept des Ziehens/Schiebens eines auf Kufen gleitenden Körpers, der zugleich stabiler Träger des Multifunktionskopfes ist.

Gruß
/barbar