Banana Pi GPIO nutzen

Feb 22, 2020 36 Replies
Jump to replies (36)

Hallo,



ich dachte mir die ganze Zeit, was ich mit einem Arduino machen kann, kann ich mit dem Banana Pi, der sowieso seine Kreise dreht, auch machen: Der hat ein Multitasking-OS und kann IPv6, das ist viel


Aber, so richtig mit "GPIO" beschriftete Pins hat der gar nicht.



formatting link
zeigt die Belegung von CON3, da gibt es SPI, verschiedene UARTs, PWM und CAN, aber nix, was


formatting link
sagt, dass man die GPIO-Pins heutzutage mit der libgpio und gpiod anspricht. Beide Pakete gibt es unter Debian, und sie scheinen auch zu funktionieren:



|1 [3/4578]mh@lapis:~ $ sudo gpiodetect |gpiochip0 [1c20800.pinctrl] (288 lines) |gpiochip1 [cp210x] (4 lines) |gpiochip2 [cp210x] (4 lines) |gpiochip3 [ftdi-cbus] (4 lines) |gpiochip4 [cp210x] (4 lines) |[4/4579]mh@lapis:~ $ sudo gpiofind gpiochip0 |1 [5/4580]mh@lapis:~ $ sudo gpioinfo |gpiochip0 - 288 lines: | line 0: "ERXD3" unused input active-high | line 1: "ERXD2" unused input active-high | line 2: "ERXD1" unused input active-high | line 3: "ERXD0" unused input active-high | line 4: "ETXD3" unused input active-high | line 5: "ETXD2" unused input active-high | line 6: "ETXD1" unused input active-high | line 7: "ETXD0" unused input active-high | line 8: "ERXCK" unused input active-high | line 9: "ERXERR" unused input active-high | line 10: "ERXDV" unused input active-high | line 11: "EMDC" unused input active-high | line 12: "EMDIO" unused input active-high | line 13: "ETXEN" unused input active-high | line 14: "ETXCK" unused input active-high | line 15: "ECRS" unused input active-high | line 16: "ECOL" unused input active-high | line 17: "ETXERR" unused input active-high | line 18: unnamed unused input active-high | line 19: unnamed unused input active-high | line 20: unnamed unused input active-high | line 21: unnamed unused input active-high | line 22: unnamed unused input active-high | line 23: unnamed unused input active-high | line 24: unnamed unused input active-high | line 25: unnamed unused input active-high | line 26: unnamed unused input active-high | line 27: unnamed unused input active-high | line 28: unnamed unused input active-high | line 29: unnamed unused input active-high | line 30: unnamed unused input active-high | line 31: unnamed unused input active-high | line 32: "PMU-SCK" unused input active-high | line 33: "PMU-SDA" unused input active-high | line 34: unnamed unused input active-high | line 35: unnamed unused input active-high | line 36: unnamed unused input active-high | line 37: unnamed unused input active-high | line 38: unnamed unused input active-high | line 39: unnamed unused input active-high | line 40: unnamed unused input active-high | line 41: "USB0-DRV" "usb0-vbus" output active-high [used] | line 42: unnamed unused input active-high | line 43: unnamed unused input active-high | line 44: unnamed unused input active-high | line 45: unnamed unused input active-high | line 46: unnamed unused input active-high | line 47: unnamed unused input active-high | line 48: unnamed unused input active-high | line 49: unnamed unused input active-high | line 50: unnamed unused input active-high | line 51: unnamed unused input active-high | line 52: "SCL" unused input active-high | line 53: "SDA" unused input active-high | line 54: unnamed unused input active-high | line 55: unnamed unused input active-high | line 56: unnamed unused input active-high | line 57: unnamed unused input active-high | line 58: unnamed unused input active-high | line 59: unnamed unused input active-high | line 60: unnamed unused input active-high | line 61: unnamed unused input active-high | line 62: unnamed unused input active-high | line 63: unnamed unused input active-high | line 64: unnamed unused input active-high | line 65: unnamed unused input active-high | line 66: unnamed unused input active-high | line 67: unnamed unused input active-high | line 68: unnamed unused input active-high | line 69: unnamed unused input active-high | line 70: unnamed unused input active-high | line 71: unnamed unused input active-high | line 72: unnamed unused input active-high | line 73: unnamed unused input active-high | line 74: unnamed unused input active-high | line 75: unnamed unused input active-high | line 76: unnamed unused input active-high | line 77: unnamed unused input active-high | line 78: unnamed unused input active-high | line 79: unnamed unused input active-high | line 80: unnamed unused input active-high | line 81: unnamed unused input active-high | line 82: unnamed unused input active-high | line 83: unnamed unused input active-high | line 84: unnamed unused input active-high | line 85: unnamed unused input active-high | line 86: unnamed unused input active-high | line 87: unnamed unused input active-high | line 88: unnamed unused input active-high | line 89: unnamed unused input active-high | line 90: unnamed unused input active-high | line 91: unnamed unused input active-high | line 92: unnamed unused input active-high | line 93: unnamed unused input active-high | line 94: unnamed unused input active-high | line 95: unnamed unused input active-high | line 96: unnamed unused input active-high | line 97: unnamed unused input active-high | line 98: unnamed unused input active-high | line 99: unnamed unused input active-high | line 100: unnamed unused input active-high | line 101: unnamed unused input active-high | line 102: unnamed unused input active-high | line 103: unnamed unused input active-high | line 104: unnamed unused input active-high | line 105: unnamed unused input active-high | line 106: unnamed unused input active-high | line 107: unnamed unused input active-high | line 108: unnamed unused input active-high | line 109: unnamed unused input active-high | line 110: unnamed unused input active-high | line 111: unnamed unused input active-high | line 112: unnamed unused input active-high | line 113: unnamed unused input active-high | line 114: unnamed unused input active-high | line 115: unnamed unused input active-high | line 116: unnamed unused input active-high | line 117: unnamed unused input active-high | line 118: unnamed unused input active-high | line 119: unnamed unused input active-high | line 120: unnamed unused input active-high | line 121: unnamed unused input active-high | line 122: unnamed unused input active-high | line 123: unnamed unused input active-high | line 124: unnamed unused input active-high | line 125: unnamed unused input active-high | line 126: unnamed unused input active-high | line 127: unnamed unused input active-high | line 128: unnamed unused input active-high | line 129: unnamed unused input active-high | line 130: unnamed unused input active-high | line 131: unnamed unused input active-high | line 132: unnamed unused input active-high | line 133: unnamed unused input active-high | line 134: unnamed unused input active-high | line 135: unnamed unused input active-high | line 136: unnamed unused input active-high | line 137: unnamed unused input active-high | line 138: unnamed unused input active-high | line 139: unnamed unused input active-high | line 140: unnamed unused input active-high | line 141: unnamed unused input active-high | line 142: unnamed unused input active-high | line 143: unnamed unused input active-high | line 144: unnamed unused input active-high | line 145: unnamed unused input active-high | line 146: unnamed unused input active-high | line 147: unnamed unused input active-high | line 148: unnamed unused input active-high | line 149: unnamed unused input active-high | line 150: unnamed unused input active-high | line 151: unnamed unused input active-high | line 152: unnamed unused input active-high | line 153: unnamed unused input active-high | line 154: unnamed unused input active-high | line 155: unnamed unused input active-high | line 156: unnamed unused input active-high | line 157: unnamed unused input active-high | line 158: unnamed unused input active-high | line 159: unnamed unused input active-high | line 160: "SD0-D1" unused input active-high | line 161: "SD0-D0" unused input active-high | line 162: "SD0-CLK" unused input active-high | line 163: "SD0-CMD" unused input active-high | line 164: "SD0-D3" unused input active-high | line 165: "SD0-D2" unused input active-high | line 166: unnamed unused input active-high | line 167: unnamed unused input active-high | line 168: unnamed unused input active-high | line 169: unnamed unused input active-high | line 170: unnamed unused input active-high | line 171: unnamed unused input active-high | line 172: unnamed unused input active-high | line 173: unnamed unused input active-high | line 174: unnamed unused input active-high | line 175: unnamed unused input active-high | line 176: unnamed unused input active-high | line 177: unnamed unused input active-high | line 178: unnamed unused input active-high | line 179: unnamed unused input active-high | line 180: unnamed unused input active-high | line 181: unnamed unused input active-high | line 182: unnamed unused input active-high | line 183: unnamed unused input active-high | line 184: unnamed unused input active-high | line 185: unnamed unused input active-high | line 186: unnamed unused input active-high | line 187: unnamed unused input active-high | line 188: unnamed unused input active-high | line 189: unnamed unused input active-high | line 190: unnamed unused input active-high | line 191: unnamed unused input active-high | line 192: unnamed unused input active-high | line 193: unnamed unused input active-high | line 194: unnamed unused input active-high | line 195: unnamed unused input active-high | line 196: unnamed unused input active-high | line 197: unnamed unused input active-high | line 198: unnamed unused input active-high | line 199: unnamed unused input active-high | line 200: unnamed unused input active-high | line 201: unnamed unused input active-high | line 202: unnamed unused input active-high | line 203: unnamed unused input active-high | line 204: unnamed unused input active-high | line 205: unnamed unused input active-high | line 206: unnamed unused input active-high | line 207: unnamed unused input active-high | line 208: unnamed unused input active-high | line 209: unnamed unused input active-high | line 210: unnamed unused input active-high | line 211: unnamed unused input active-high | line 212: unnamed unused input active-high | line 213: unnamed unused input active-high | line 214: unnamed unused input active-high | line 215: unnamed unused input active-high | line 216: unnamed unused input active-high | line 217: unnamed unused input active-high | line 218: unnamed unused input active-high | line 219: unnamed unused input active-high | line 220: unnamed unused input active-high | line 221: unnamed unused input active-high | line 222: unnamed unused input active-high | line 223: unnamed unused input active-high | line 224: "TXD0" unused input active-high | line 225: "RXD0" unused input active-high | line 226: "IO-1" unused input active-high | line 227: "PH3" "usb2-vbus" output active-high [used] | line 228: "USB0-IDDET" "usb0_id_det" input active-high [used] | line 229: "PH5" unused input active-high | line 230: unnamed "usb1-vbus" output active-high [used] | line 231: unnamed unused input active-high | line 232: unnamed unused input active-high | line 233: unnamed unused input active-high | line 234: "SD0-DET" "cd" input active-low [used] | line 235: unnamed unused input active-high | line 236: unnamed unused input active-high | line 237: unnamed unused input active-high | line 238: unnamed unused input active-high | line 239: unnamed unused input active-high | line 240: unnamed unused input active-high | line 241: unnamed unused input active-high | line 242: unnamed unused input active-high | line 243: unnamed unused input active-high | line 244: "IO-4" unused input active-high | line 245: "IO-5" unused input active-high | line 246: unnamed unused input active-high | line 247: "EMAC-PWR-EN" "gmac-3v3" output active-high [used] | line 248: "LED1" "bananapi:green:usr" output active-high [used] | line 249: unnamed unused input active-high | line 250: unnamed unused input active-high | line 251: unnamed unused input active-high | line 252: unnamed unused input active-high | line 253: unnamed unused input active-high | line 254: unnamed unused input active-high | line 255: unnamed unused input active-high | line 256: unnamed unused input active-high | line 257: unnamed unused input active-high | line 258: unnamed unused input active-high | line 259: "IO-GCLK" unused input active-high | line 260: unnamed unused input active-high | line 261: unnamed unused input active-high | line 262: unnamed unused input active-high | line 263: unnamed unused input active-high | line 264: unnamed unused input active-high | line 265: unnamed unused input active-high | line 266: "SPI-CE0" unused input active-high | line 267: "SPI-CLK" unused input active-high | line 268: "SPI-MOSI" unused input active-high | line 269: "SPI-MISO" unused input active-high | line 270: "SPI-CE1" unused input active-high | line 271: unnamed unused input active-high | line 272: "IO-6" unused input active-high | line 273: "IO-3" unused input active-high | line 274: "IO-2" unused input active-high | line 275: "IO-0" unused input active-high | line 276: unnamed unused input active-high | line 277: unnamed unused input active-high | line 278: unnamed unused input active-high | line 279: unnamed unused input active-high | line 280: unnamed unused input active-high | line 281: unnamed unused input active-high | line 282: unnamed unused input active-high | line 283: unnamed unused input active-high | line 284: unnamed unused input active-high | line 285: unnamed unused input active-high | line 286: unnamed unused input active-high | line 287: unnamed unused input active-high |gpiochip1 - 4 lines: | line 0: unnamed unused input active-high | line 1: unnamed unused input active-high | line 2: unnamed unused output active-high | line 3: unnamed unused input active-high |gpiochip2 - 4 lines: | line 0: unnamed unused input active-high | line 1: unnamed unused input active-high | line 2: unnamed unused output active-high | line 3: unnamed unused input active-high |gpiochip3 - 4 lines: | line 0: unnamed unused input active-high | line 1: unnamed unused input active-high | line 2: unnamed unused input active-high | line 3: unnamed unused input active-high |gpiochip4 - 4 lines: | line 0: unnamed unused input active-high | line 1: unnamed unused input active-high | line 2: unnamed unused output active-high | line 3: unnamed unused input active-high |[6/4581]mh@lapis:~ $


Ich gehe mal davon aus, dass gpiochip0 der auf dem Board (im SOC?) befindliche GPIO-Controller ist, die anderen gpiochips sehen mir von


Raspberry-Pi-Doku verwenden oder gibt es signifikante Unterschiede zum Banana Pi?


Pullup-Widerstand versehen und dann mit einem Optokoppler gegen Masse ziehen kann. Ich vermute, dass man fast jeden Pin aus seiner dokumentierten Funktion rausnehmen und zum "normalen" GPIO machen kann, aber wie?



Hat jemand schonmal die GPIO-Pins eines Banana Pi verwendet?



Leider stirbt die Plattform ja langsam aus :-(


Marc


-------------------------------------- !! No courtesy copies, please !! ----- Marc Haber | " Questions are the | Mailadresse im Header Mannheim, Germany | Beginning of Wisdom " | Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834

Die Pins sollten (*) kompatibel zu denen eines Raspberry Pi sein, die kann man hier sehr schön betrachten:

formatting link
(NOTE: Du weißt, daß die Pins nur 3V3 vertragen?)

(*) Ich habe einen Bananapi Router an dessen GPIOs ich ein paar Teile (u.a. Optokoppler um meine zwei NAS ein zu schalten und ein SSR um ein Fax-Modem ein zu schalten) betreibe. Dort ist es auch kompatibel.

Josef

Nicht.

Raspberry (und/oder Banana) und Arduino haben deutlich unterschiedliche Anwendungsfälle. Und wenn es um GPIOs geht, dann ist der Arduino definitiv schneller. Ist eben ein Mikrocontroller. Der Arduino hat auch "echte" Interrupts und erlaubt Zeitmessungen bis runter in den Nanosekundenbereich.

Man kann die GPIOs gut nutzen wenn man z.B. einen Raspberry in eine Gehäuse baut und ins gleiche Gehäuse noch ein LCD verbauen will. Das schließt man dann einfach am GPIO mit an und steuert es direkt im Linux an. Bei allem was weiter geht hänge ich lieber einen Arduino an den USB vom Raspberry.

Es gibt Unterschiede. Im Zweifelsfall die Pinouts nebeneinander legen. Raspberry hat z.B. keine Pins für CAN.

Ich halte das mittlerweile so, dass ich alles, was nicht "Raspberry" heißt, direkt beim Händler liegen lasse. Mag ja sein das andere Boards auf dem Papier bessere Daten haben. Bringt aber nichts wenn die Community drum rum zu klein ist.

Gruß

Manuel

Brauch ich alles nicht, ich hätte es gerne simpel.

Der Banana Pi war 2015 super, wenn man ein kleines Serverchen haben wollte: Richtiges SATA für eine richtige Platte, und anständig angebundenes Ethernet, nicht so eine USB-Bastelei.

Gibt es in der Raspberry-Welt bis heute nicht, und ich bin zu faul, mir noch eine Exoten-Architektur ans Bein zu binden für die ich meine Pakete bauen muss.

Aber das geht alles an der Frage vorbei.

Grüße Marc

Dann würde ich dir WiringPi empfehlen. "pinMode", "digitalWrite", ... ähnlich wie Arduino für den Raspberry.

Wurde wohl für den Banana geforkt:

formatting link

Raspberry Pi 4. Vollwertiges Gigabit Ethernet das nicht mehr am USB hängt und 2x vollwertige USB 3.0.

Zumindest ich bevorzuge USB 3.0 vor SATA, denn so kann man die Platte sauber in ein handelsübliches Gehäuse einbauen und einfach mit USB 3.0 anschließen.

Bei einem Bekannten hab ich den Pi 4 schon knapp nach Markteinführung als 24/7 laufenden TV-Streaming-Server aufgebaut. Da hängen 6 vollwertige SAT-Tuner dran und für die Aufnahmen eine 4TB-Platte im externen Gehäuse. Im Haus verteilt sind Raspberry 3 mit LibreElec als Clients.

Gruß

Manuel

Aber dafür diverse Kühlprobleme, und IIRC immer noch nicht mit plain Debian betreibbar. Und, nochmal IIRC, nicht binärkompatibel zum Banana Pi, also eine neue Architektur die mit Paketen bespielt werden will.

Ich habe das USB vom Raspi 4 noch nicht ausprobiert, aber am Desktop funktioniert eSATA um einiges flauschiger als USB3, insbesondere ist die Datenübertragungslinie beim Bulk Write eine Hochebene, während sie bei USB 3 eher ein Gebirge ist.

Grüße Marc

Also, ich hab das jetzt zum Laufen gebracht und dokumentiere für die Nachwelt (und freue mich auf Eure Kommentare).

Schritt 1: Wir bauen uns ein "known good" Referenzsystem um die elektronischen Schaltungen zu validieren. Schrank auf, Raspi raus, aktuelles Raspian installiert, Doku gelesen, gpiozero installiert, sich insbesondere über "pinout" gefreut, dann die beiden LED-Blink- und Schalter-Abfrage-Programme ausprobiert und Funktion verifiziert.

Schritt 2: gpiozero auf dem Banana Pi installiert, nach Aufruf von "pinout" festgestellt, dass das eine Raspberry-Pi-spezifische Software zu sein scheint, mit dem LED-Blink-Programm verifiziert. Geflucht. Kaffee getrunken.

Schritt 3: Raspbian mit gpiod ausprobiert, verstanden wie gpioset und gpioget funktioniert. LED-Blink und Schalter-Abfrage-Programm als Shellscript implementiert.

Schritt 4: Nach einer Dokumentation des Pinout des Banana Pi gesucht, auf dem sich die Namen der Pins mit der Ausgabe von gpioinfo deckt. Mit

formatting link
gefunden.

Schritt 5: Entschieden, die "speziell" gelabelten Pins links liegen zu lassen, GPIO0 bis GPIO6 reichen mir völlig. In der Ausgabe von gpioinfo heißen die "IO-0" bis "IO-6".

Schritt 6: LED-Blink-Programm (auf GPIO6): |while true; do gpioset --mode=time --sec=1 gpiochip0 272=1; gpioset --mode=time --sec=1 gpiochip0 272=0; done Meine Vermutung ist, dass gpioset nur so lange es läuft bereit ist, eine definitive Aussage über den Zustand des pins zu treffen, daher das Geraffel mit --mode und --sec.

Schritt 7: Schalter-Abfrage-Programm (wiederum GPIO6): |while sleep 1; do gpioget gpiochip0 272; done Pull-Up-Widerstand 47 kOhm, Schalter gegen Masse. Funktioniert.

So kann ich arbeiten. Wenn ich lustig bin mach ich eine udev-Regel die den Zugriff auf /dev/gpiochip0 auch als nicht-root erlaubt, aber für heute reicht mit das jetzt erstmal.

Grüße Marc

Das wundert mich. Weil riesige Datenmengen -- Komplettbackup -- über LAN (Kabel, nicht W) ewig dauern, kopiere ich an einem Rechner von einer externen Platte an USB zu einer genauso angeschlossenen anderen. Das läuft. Die geringere Geschwindikeit von Partitionen mit vielen kleinen Dateien liegt nicht am Übertragungskanal.

Du kannst mir glauben dass ich in der Lage bin, Hardwareperformance zu bewerten.

Hi Manuel,

nicht zwingend.

Welchen Arduino mit GHz Prozessor meinst Du jetzt genau?

Wenn Du UNO, Nano und Konsorten meinst, da ist mit 16 MHz kein ns

Ich hab mal gelesen, dass die OrangePi-Szene vor allem stolz darauf ist,

Projekte, abseits des Kostenvorteils nicht unrelevant ist.

Marte

Hi Marc,

Doch, das sei doch der entscheidende Unterschied beim RasPi4

Marte

USB3, zwei Ports, und sauber angebundenes Ethernet. Da wirst du dich über Durchsatz nicht beschweren können.

Gerrit

Ich habe meinen Ausführungen an anderer Stelle in diesem Thread nichts hinzuzufügen.

Grüße Marc

Hi Marc,

Ich würde das tatsächlich mal auf einen Versuch ankommen lassen, ob der Banana Pi von 2015 wirklich auf seinem SATA mehr Datendurchsatz schafft, als der RasPi4 über USB3.

Ansonsten ist und bleibt es so, dass die Teile stromsparende Minimalmaschinchen sind und keine Rennschweine.

Marte

Am 24.02.2020 um 10:46 schrieb Marte Schwarz:

Nö, tut er nicht.

Ich habs letztens mal gemessen, und war echt enttäuscht was da zustande kam. Wenn die neue Platte für den Raspi da ist, kann ich mal die Messwerte nachliefern.

Ja, man kann nicht alles haben. Aber als Fileserver schafft der Pi4 wohl

55 MB/sec schreibend und kann das Gbit Ethernet beim Lesen annähernd auslasten.

Wem das nicht reicht, der muss eben andere Hardware nehmen. Kostet dann auch einen Tick mehr.

Wenn die USB3-Performance nicht passt, vielleicht das hier mal probieren:

formatting link
Gerrit

Die Anleitung ist in der Tat sehr empfehlenswert.

Beim Bekannten bei dem ich den Server auf Raspi 4 Basis gebaut habe, hatte ich nämlich genau das Problem.

Das geht bei einem Server (also 24/7) dann soweit bis der Kernel die Platte irgendwann readonly mountet und dann war's das mit Schreiben.

Seit Einfügen dieses "quirks" läuft die Platte sauber.

Ich bin froh statt SATA zwei USB 3.0 zu haben. SATA stirbt so langsam eh weg (nurnoch für magnetische Datenträger) und USB 3.0 ist flexibler. Da gehen auch LAN-Karten dran was am SATA nicht geht.

Gruß

Manuel

Die Schranktuer nicht wieder zugemacht? Oh-oh ... :-)

Kommt mir vom Pogoplug her bekannt vor, auch wenn ich da keinen Kaffee getrunken habe.

Davon verstehe ich zuwenig, aber bei uC setzen wir solche Ports meist auf Interrupt, sodass sofort angezeigt wird, wenn sich der Status eines Ports geaendert hat.

[...]

Selbst mein alter Pogoplug Mobile kommt ueber die Strecke USB3.0 -> LAN auf 0-40MB/sec und der ist aus dem Jahr 2011.

Das Dingen hat auch einen nichtbestueckten SATA Landeplatz auf der Leiterplatte, der nochmal 20-30% mehr bringen soll. Aber wozu?

Ich frage mich immer, warum man noch mehr braucht. Selbst bei einer Grossfamilie mit 5-6 Fernsehern koennte man das nicht an den Poller bringen. Ich habe seit gut einem Jahr 75Mbit/sec Internet, der langsamste angebotene Tarif. Es ist ja ganz toll, wenn irgendein Major Update beinahe durchblitzt, aber notwendig ist das nicht.

[...]
Gruesse, Joerg http://www.analogconsultants.com/

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required