Raspberry Pi Zero Steuerung über Bluetooth

  • Hallo,


    und zwar möchte ich meinen RasPi Zero über Bluetooth Steuern also die GPIO...

    Mit Python habe ich den RasPi Programmiert und wenn ich den Quellcode starte funktioniert das auch ..

    Ich habe mich mit dem RasPi verbunden und sehe auch das ich Daten vom Handy empfange also ich sende via BlueTerm 2 z.b. eine 1 oder eine 0 und sehe dies auch..

    Es soll dementsprechend auch den 11. Pin auf High oder Low setzen, tut es aber nicht. GPIO funktioniert, das habe ich getestet..

    Ich hoffe es hat jemand eine Idee warum das nicht klappt..

    Mein Quellcode:


    import bluetooth

    import RPi.GPIO as GPIO

    GPIO.setmode(GPIO.BOARD)

    GPIO.setup(11, GPIO.OUT)

    GPIO.setwarnings(False)


    server_socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)


    port = 1

    server_socket.bind(("", port))

    server_socket.listen(1)


    client_socket, address = server_socket.accept()

    print ("Verbunden ", address)

    try:

    while 1:

    data = client_socket.recv(1024)

    print ("Empfangen: %s" % data)

    if (data == "0"):

    GPIO.output(11, 0)

    if (data == "1"):

    GPIO.output(11, 1)


    finally:

    print("Clean!")

    GPIO.cleanup()

    client_socket.close()

    server_socket.close()


    dementsprechend erscheint unten


    Verbunden ('8C:1X:BX:B9:6X:3X', 1)

    Empfangen: b'0'

    Empfangen: b'1'


    Aber die LED leuchtet nicht auf, es liegt daran das er den Pin nicht auf High setzt.


    Danke schon mal ..:danke_ATDE::danke_ATDE::danke_ATDE:

    Edited 3 times, last by crank ().

  • Mit Python habe ich den RasPi Programmiert

    Bei diesem Satz sterbe ich jedes mal innerlich. Stimmt denn PinLayout? Board oder BCM? Bitte benutze code tags (und passe die Einrückungen an)

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • "Empfangen: %s"

    Empfangen b : 1 oder

    Empfangen b : 0

    Da hast du uns nicht die ganze Wahrheit erzählt. Wenn das oben dein String zur Formatierung ist kann da unmöglich ein " b " mit zwei Leerzeichen vor dem Doppelpunkt erscheinen. Bitte immer die tatsächliche Ausgabe posten.


    Das b könnte aber darauf hinweisen (wenn es doch an einer anderen Stelle ist), dass es sich bei data um bytes handelt. Wenn du Python 3 verwendest wäre data == "1" (oder "0") immer False:

    Python
    1. >>> "b" == b"b"
    2. False
    3. >>> "b" == b"b".decode()
    4. True
    5. >>>

    Die bytes kannst du mit der Methode decode in einen String umwandeln.

    :wink:

  • Hi linusg


    die korrekte Ausgabe:


    Verbunden ('8C:1X:BX:B9:6X:3X', 1)

    Empfangen: b'1'

    Empfangen: b'0'



    Habe die Zeile nun verändert

    ..

    try:

    while 1:

    data = client_socket.recv(1024)

    print ("Empfangen: %s" % data.decode())

    if (data == "0"):

    GPIO.output(11, 0)

    if (data == "1"):

    GPIO.output(11, 1)


    nun sieht die Ausgabe so aus


    Verbunden ('8C:1X:BX:B9:6X:3X', 1)

    Empfangen: 1

    Empfangen: 0


    Aber die LED, also der GPIO Pin wird nicht auf High gestellt..

    Getestet habe ich es gerade, ob es richtig angeschlossen ist

    Sie leuchtet auf, wenn ich ihn "manuell" auf High schalte

    Edited 2 times, last by crank ().

  • Stimmt denn PinLayout? Board oder BCM? Bitte benutze code tags (und passe die Einrückungen an)

    :richter:

    Das b könnte aber darauf hinweisen (wenn es doch an einer anderen Stelle ist), dass es sich bei data um bytes handelt. Wenn du Python 3 verwendest wäre data == "1" (oder "0") immer False:

    Die bytes kannst du mit der Methode decode in einen String umwandeln.

    :2cents:

    :wink:

  • linusg


    Es klappt jetzt wenn der Code so aussieht...

    while 1:

    data = client_socket.recv(1024)

    print ("Empfangen: %s" % data)

    if (data == b'0'):

    GPIO.output(11, 0)

    if (data == b'1'):

    GPIO.output(11, 1)

    aber gibt es eine Möglichkeit das "b" weg zubekommen, falls nicht -> Hauptsache es funktioniert jetzt?


    zu dbv

    Ja layout stimmt und board ..

  • Entschuldigung ... :D


    Hat geklappt..


    Nun versuche ich mal es über meine App zu steuern.

    Weißt du vllt woran es liegen kann, ich verbinde mich dann bleibt die Verbindung ca. 10 sek. und dann bricht sie ab.

  • Hallo,


    bin noch an der App für das Handy dran.

    Wenn ich auf Verbinden klicke erscheint nichts, aber wenn Bluetooth aus ist kommt meine Meldung. (Logisch...)

    Ich beobachte auf dem RasPi Zero das für kurze Zeit (einige Sekunden) eine Verbindung entsteht, diese wird aber dann abgebrochen.

    Als Ausgabe kommt auch nichts, mit BlueTerm funktioniert das ganze..


    Also ich möchte immernoch die GPIO steuern.

    Weiß jemand vielleicht woran es liegt? Bin ich komplett falsch an die Sache ran?


    Das ganze habe ich mit C# gemacht..


    Mein Quellcode:


    Ich hoffe ihr könnt mir helfen...:conf:


    Danke im voraus!! :geek:

    Edited once, last by crank ().

  • Mit C# hast du also Xamarin als Framework?


    Damit kenne ich mich nicht aus, in Java habe ich schon einige Android Apps geschrieben. Allerdings nie mit Bluetooth gearbeitet. Die Doku von Google diesbezüglich ist ziemlich gut, aber wenn du einen Link zur entsprechenden Xamarin Bluetooth Doku hast, kann ich mir das ganze mal anschauen... oder haben die das Java API 1:1 gemappt? Aus deren Website werde ich auf die schnelle nicht so ganz schlau.

    :wink:

  • Ja, danke. Die Frage ist, wer terminiert die Verbindung und bis wo wird dein Code ausgeführt? Ich kann diesen komplett nachvollziehen, es wäre nun interessant, welche Blöcke abgearbeitet werden. Und gibt es auf dem Raspi Ausgaben/Logfiles, die du noch posten könntest?

    :wink:

  • Also mit dem BlueTerm klappt das ja.. also terminiert die App die Verbindung oder?

    Er arbeitet meiner Meinung nach alles ab bis:




    Code
    1. else
    2. {
    3. var socket = device.CreateRfcommSocketToServiceRecord(UUID.FromString("00000000-0000-1000-8000-00805F9B34FB"));
    4. await socket.ConnectAsync();
    5. btnBluetooth.Enabled = false;
    6. builder.SetMessage("Verbindung erfolgreich");
    7. AlertDialog statusAlert = builder.Create();
    8. statusAlert.Show();
    9. }


    da er ja kurz Verbindet aber kein Alert kommt.

    Wenn ich aber:


    Code
    1. else
    2. {
    3. builder.SetMessage("Verbindung erfolgreich");
    4. AlertDialog statusAlert = builder.Create();
    5. statusAlert.Show();
    6. var socket = device.CreateRfcommSocketToServiceRecord(UUID.FromString("00000000-0000-1000-8000-00805F9B34FB"));
    7. await socket.ConnectAsync();
    8. btnBluetooth.Enabled = false;
    9. }


    wenn ich das so schreibe, kommt ein Alert mit "Verbindung erfolgreich"

  • So. Ich habe mal gesucht und etwas gefunden. http://www.vishalavalani.com/c…aspberry-pi-robot-part-2/

    Scheint im groben und ganzen das zu sein, was du erreichen willst und ist deinem Code auch recht ähnlich. Die prinzipielle Herangehensweise scheint korrekt, nur:

    Code
    1. var socket = device.CreateRfcommSocketToServiceRecord(UUID.FromString("00000000-0000-1000-8000-00805F9B 34FB"));

    Wieso sind da 28 Leerzeichen drin?

    In Beitrag #13 dann nicht mehr? Welche Version hast du jetzt genau im Code?

    (Und lass das var mal weg, den Typ gibst du weiter oben mit BluetoothSocket socket; ja schon an.)


    Auf der verlinkten Seite allerdings ist eine andere UUID (erstes "Byte"):

    Code
    1. socket = device.CreateRfcommSocketToServiceRecord(UUID.FromString("00001101-0000-1000-8000-00805f9b34fb"));

    Die selbe findet sich auch in der Xamarin Doku (https://developer.xamarin.com/…Java.Util.UUID/#Remarks):

    Quote

    Hint: If you are connecting to a Bluetooth serial board then try using the well-known SPP UUID 00001101-0000-1000-8000-00805F9B34FB. However if you are connecting to an Android peer then please generate your own unique UUID.

    Vielleicht ist das schon die Lösung?

    :wink:

  • Habe mir ein alert ausgeben lassen, nach dem

    Code
    1. socket = device.CreateRfcommSocketToServiceRecord(UUID.FromString("00001101-0000-1000-8000-00805f9b34fb"));

    und das hat funktioniert.


    Ein Alert für das habe ich auch gemacht

    Code
    1. await socket.ConnectAsync();

    dies wurde nicht angezeigt, also bricht es nach dieser Zeile ab oder?

  • dies wurde nicht angezeigt, also bricht es nach dieser Zeile ab oder?

    Das ist ja asynchron, pauschal kann man es also so nicht sagen. Versuche mal die synchrone Verbindungsmethode, gibt es ganz sicher (socket.connect(), socket.Connect() o.ä.) und schaue, ob er bis danach kommt und wie lange das ungefähr dauert (Meldung davor, Meldung danach) - so kann man abschätzen, ob überhaupt so etwas wie ein Timeout o.ä. greift.

    Ansonsten gehen mir langsam die Ideen aus, ich kann aber wenn ich in den nächsten Tagen einmal Zeit finde das ganze nachstellen, denn BT steht auch schon auf meiner ToDo Liste :) (App compilieren, ein Script auf einem Pi 3 oder Zero W ausführen sollte ja kein Problem sein.)

    :wink:

  • Ja das habe ich jetzt mal synchron gemacht.

    Siehe da, das Alert wird angezeigt "Verbindung erfolgreich"!

    Aber die Verbindung bricht trotzdem ab..

    Habe es auch mal versucht mich davor mit dem RasPi zu verbinden, also vom Handy aus (nicht mit der APP)

    Was klar war, dass die Verbindung nun erhalten bleibt. Aber kein Unterscheid, es passiert nichts.

    So ca. 5 Sekunden dauert die Verbindung

    Edited once, last by crank ().