Bluetooth HC-06 verbinden mit Arduino(ohne Bootlader)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Bluetooth HC-06 verbinden mit Arduino(ohne Bootlader)

      Hallo, kann mir bitte jemand helfen.
      Ich habe einen Test-Arduino-Sketch (wurde auf der Arduinoplattform geschrieben - nicht von mir!)getestet und erfolgreich zum Laufen gebracht:
      1.Verbindung Smartphone zum HC-06
      2.Senden vom Smartphone eine 2 oder eine 0
      3. LED leuchtet oder wird ausgeschaltet
      So weit, so gut. Ich brauche dieses Stück Code aber in Bascom, da ich schon lange mit Bascom arbeite und mich nicht unbedingt mehr an C umgewöhnen will.
      Ergebnis soll sein: Vom Smartphone einfache Zahlen 1 bis 9 senden und über Arduino (Atmega328) 2 Servos und LEDs an- und auszuschalten.
      Ich habe verschiedene Sachen mit RX / TX versucht - komme aber zu keinem Ergebnis.
      Hier der verwendete c-Sketch:

      Quellcode

      1. char blueToothVal; //Werte sollen per Bluetooth gesendet werden
      2. char lastValue; //speichert den letzten Status der LED (on/off)
      3. void setup(){
      4. Serial.begin(9600); //serieller Monitor wird gestartet, Baudrate auf 9600 festgelegt
      5. pinMode(13,OUTPUT); //PIN 13 wird als Ausgang festgelegt
      6. }
      7. void loop(){
      8. if(Serial.available()) //wenn Daten empfangen werden...
      9. {
      10. blueToothVal=Serial.read();//..sollen diese ausgelesen werden
      11. }
      12. if (blueToothVal=='2') //wenn das Bluetooth Modul eine „2“ empfängt..
      13. {
      14. digitalWrite(13,HIGH); //...soll die LED leuchten
      15. if (lastValue!='2') //wenn der letzte empfangene Wert keine „2“ war...
      16. Serial.println(F("LED is on")); //..soll auf dem Seriellen Monitor „LED is on“ angezeigt werden
      17. lastValue=blueToothVal;
      18. }
      19. else if (blueToothVal=='0') //wenn das Bluetooth Modul „0“ empfängt...
      20. {
      21. digitalWrite(13,LOW); //..soll die LED nicht leuchten
      22. if (lastValue!='0') //wenn der letzte empfangene Wert keine „0“ war...
      23. Serial.println(F("LED is off")); //..soll auf dem seriellen Monitor „LED is off“ angezeigt werden
      24. lastValue=blueToothVal;
      25. }
      26. }
      Alles anzeigen
    • Schau mal in den thread, da wirst du einen Empfangscode finden, den du für deine vom hc06 kommenden Steuerzeichen umbauen kannst. Welche App verwendest du zum Senden?
      ATmega mit ATmega über UART verbinden und Daten senden

      Im playstore kannst du mal nach hc06 suchen, da gibt es etliche apps zur Auswahl.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Danke für die schnelle Antwort.
      Im Arduino Sketch mit "C" verwende ich 2 verschiedene Apps, die beide funktionieren (aber zZt nur mit dem Test sketch.
      1.Arduino Bluetooth (CircuitMagic)
      2.Arduino bluetooth contr... (Giumig Apps)
      Werde dann gleich morgen den Empfangscode probieren und hof. die Erfolgsmeldung präsentieren.
      DANKE
    • Ist vielleicht besser, den code von @Michaels link zu verwenden. Der von mir genannte thread ist recht lang und unübersichtlich.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Blutooth HC-06 mit Atmega328

      Alte Nachricht (wurde leider noch nicht versendet)
      Hallo Michael, Danke für die Antwort. Meine progr-Kenntnisse gehen in Bascom bis zur Ansteuerung eine 8x8 Matrix.
      Auch eine Ansteuerung über Tasten von 8 Servos mit dem alten TDA8444 habe ich im Test mit I2C realisiert.
      In einem Stellwerk auf meiner LGB-Anlage habe ich ein "pseudo" Fahrpult eingebaut, welches 2 Züge im Bild fahren läßt.
      Die Kinder, die sich die Anlage ansehen kommen sind immer wieder begeistert. Auch wurde bereits ein "WLAN"-Haus gebaut
      (Verbindung ebenfalls mit Handy) und ein 2. Stellwerkhaus.
      Das 2. Stellwerkhaus wird mit einem 2313 gesteuert (über einen Auslösekontakt m Gleis) . Dann kommt der Stellwerker durch eine sich öffnende
      Schiebetür heraus (realisiert mit einem altenCD-Laufwerk) - nach einem Zeitablauf geht alles wieder zurück. Alles ziemlich einfache Abläufe.
      Aber es funktioniert.
      Das 1. Stellwerkhaus wurde in der Zeitschrift "GartenBahn" veröffentlicht.
      2 Bilder vom Stellwerk 1Stellwerk3.jpgTestlauf-Zug.JPG
      -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      Neue Nachricht
      Hallo Michael, habe " AI2 APP Inventor 2 Teil 7 Bascom Programm " erfolgreuch mit der App und deinem Programm testen können. Funktioniert alles,
      wenn man die Fuses auf ext. Quarz setzt.
      2 Fragen hätte ich dazu:
      1. Leider habe ich noch nicht rausbekommen, wie man den Stellbereich des Servos vergrößert ? Habe mit LCD die Werte parallel ausgelesen und verändert
      -habe es aber noch nicht hinbekommen.
      2. Ich wollte die APP Inventor installieren, um das vorhandene Beispiel versuchen zu erweitern. Leider konnte ich die APP auf meinem WIN 10 PC noch nicht installieren.
      -habe Firefox und ein google konto aber den editor bekomme ich nicht zu sehen - vielleivht, weil Weihnachten ist?
      Vielen Dank im voraus
      Allen noch ein paar restliche schöne Feiertage
    • siggimu schrieb:

      Leider konnte ich die APP auf meinem WIN 10 PC noch nicht installieren.
      die App vom App inventor für den PC läuft im Browser in diesem Link:
      ai2.appinventor.mit.edu/


      siggimu schrieb:

      Stellbereich des Servos vergrößert
      Entweder im App Invernor den Maximalwert des Sliders ändern oder im Bascom Programm entsprechend den Faktor in Zeile 78 vergrößern.
      Um wieviel Prozent geht es denn?
    • siggimu schrieb:

      ich brauche max. 10% mehr Stellweg ( Max.-wert + 10%)
      Das App-Inventor Programm erzeugt einen Bereich von 0-200.
      Werte unter Null sind schlecht zu übertragen.
      Wenn du jetzt auf 220 als Maximalwert gehst, dann ändert sich nur die eine Richtung des Servowegs, die andere Seite (die Null) bleibt ja.

      Deshalb solltest du im Bascom-Programm Zeile 79 den Offset von 2000 auf 1900 absenken, damit der Zuwachs in beide Richtungen stimmt.
    • Kurze Zusammenfassung:
      1. die Beschreibung der APP-Inventor ist super! Habe schon die APP für ein 2. Servo erweitert (natürlich mit abgucken) funktioniert einwandfrei !!! a_42_02cc30b2
      2. das Bluetooth modul HC-06 brauche ich nicht zu konfigurieren - es werden alle Zeichen verarbeitet :)
      3. im Bascom-programm habe ich die "Null" mit 1800 verschieben können - funktioniert :)
      4. im APP-Inventor mussich das noch probieren - bin aber sehr zuversichtlich !

      Eine Frage zum APP-Inventor Programm:
      Die beiden Servos haben bei der Bedienung mit der APP eine geringe Beeinlussung. Gibt es einen Trick oder eine Ausschlusskriterium, wenn ich das eine Servo bediene (bewege) hat das
      andere Pause ?
      Das erste Servo habe ich im Bascom Programm auf Empfang (Temp) = 13 gelassen, das zweite läuft auf Empfang (Temp) = 15.

      Dank im voraus
    • siggimu schrieb:

      Das erste Servo habe ich im Bascom Programm auf Empfang (Temp) = 13 gelassen, das zweite läuft auf Empfang (Temp) = 15.
      Ähh, nein, falscher Ansatz. Das Ende deiner Übertragung sollte immer mit einem CR sein, also 13
      Es werden ja von der App die 3 Ziffern und das Ende-Zeichen (Ascii) übertragen.
      Für mehrere Servos solltest du ein Protokoll verwenden, z.B. einen Buchstaben am Beginn der Übertragung, der sagt, welches Servo gemeint ist.

      AI_2_Slider.png

      Im Bascom Programm legst du 2 Servo-Variablen an und befüllst die im seriellen Interrupt:

      BASCOM-Quellcode: serieller Interrupt

      1. Seriell_irq:
      2. Toggle Led
      3. Temp = Udr
      4. If Temp = "A" Then
      5. Prefix = 1
      6. Goto Interruptende
      7. End If
      8. If Temp = "B" Then
      9. Prefix = 2
      10. Goto Interruptende
      11. End If
      12. If Temp = 13 Then
      13. Servo(prefix) = Val(s3)
      14. S3 = ""
      15. Mitzaehler = 0
      16. Else
      17. Incr Mitzaehler
      18. If Mitzaehler < 4 Then
      19. S3 = S3 + Chr(temp)
      20. End If
      21. End If
      22. Interruptende:
      23. Return
      Alles anzeigen


      und im Servo-Interrupt gibst du nacheinander die Werte aus und berechnest gleich den neuen Wert:

      BASCOM-Quellcode: Servointerrupt

      1. T1_irq:
      2. Timer1 = Timerwert
      3. If Servozaehler = 1 Then
      4. Servopin_1 = 1
      5. Servopin_2 = 0
      6. 'Berechnung für das nächste mal
      7. Twert = Servo(2) * 10
      8. Twert = Twert + 2000
      9. Timerwert = 0 - Twert
      10. Elseif Servozaehler = 2 Then
      11. Servopin_1 = 0
      12. Servopin_2 = 1
      13. Timerwert = 45536
      14. Else
      15. Servozaehler = 0
      16. Servopin_1 = 0
      17. Servopin_2 = 0
      18. 'Berechnung für das nächste mal (Servo 1)
      19. Twert = Servo(1) * 10
      20. Twert = Twert + 2000
      21. Timerwert = 0 - Twert
      22. End If
      23. Incr Servozaehler
      24. Return
      Alles anzeigen
    • Hallo Michael, jetzt habe ich die Programmteile zusammengefügt. Das Programm will aber in der zeile
      Servo(prefix) = Val(s3) eine arrayfestlegung. Fehlercode: 238
      in Zeile 70
      Nun habe ich das hin und her versucht, habe aber mit arrays noch keine Erfahrung.
      Bitte kannst Du mir einen Tip geben ?
      Programm siehe unten
      Danke Siggimu


      BASCOM-Quellcode: Bluetooth-Servo-Test2018-3

      1. 'Bascom -quellcode : Bluetooth_servo
      2. 'ext.Quarz über Fuses eingestellt!
      3. $regfile = "m328pdef.dat"
      4. $crystal = 16000000
      5. $hwstack = 34
      6. $swstack = 32
      7. $framesize = 40
      8. $baud = 9600
      9. '----------------------------------------------
      10. Config Timer1 = Timer , Prescale = 8
      11. On Timer1 T1_irq
      12. Enable Timer1
      13. On Urxc Seriell_irq
      14. Enable Urxc
      15. Enable Interrupts
      16. '----------------------------------------------
      17. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
      18. Db7 = Portd.7 , E = Portb.1 , Rs = Portb.0
      19. Config Lcd = 16 * 2
      20. Cls
      21. Upperline
      22. Lcd "Hallo Siggi"
      23. Waitms 100
      24. '------------------------------------------------
      25. Led Alias Portc.5
      26. Ddrc.5 = 1
      27. '----------------------------------------------
      28. Servopin_1 Alias Portc.2
      29. Ddrc.2 = 1
      30. Servopin_2 Alias Portc.3
      31. Ddrc.3 = 1
      32. Dim Servozaehler As Byte
      33. Dim Temp As Byte
      34. Dim Servo As Byte
      35. Dim Twert As Word
      36. Dim Timerwert As Word
      37. Dim Mitzaehler As Byte
      38. Dim S3 As String * 3
      39. Dim Prefix As Byte
      40. Twert = Servo * 10
      41. Twert = Twert + 925
      42. Timerwert = 0 - Twert
      43. '---------------------------------------------
      44. Do
      45. Led = 1
      46. Waitms 100
      47. Led = 0
      48. Waitms 900
      49. Loop
      50. '---------------------------------------------
      51. Seriell_irq:
      52. 'Toggle Led
      53. Temp = Udr
      54. If Temp = "A" Then 'Tür auf/zu links
      55. Prefix = 1
      56. Goto Interruptende
      57. End If
      58. If Temp = "B" Then 'Tür auf/zu rechts
      59. Prefix = 2
      60. Goto Interruptende
      61. End If
      62. If Temp = 13 Then
      63. Servo(prefix) = Val(s3)
      64. S3 = ""
      65. Mitzaehler = 0
      66. Else
      67. Incr Mitzaehler
      68. If Mitzaehler < 4 Then
      69. S3 = S3 + Chr(temp)
      70. End If
      71. End If
      72. Interruptende:
      73. '---------------------------------------
      74. Lowerline
      75. Lcd Temp ; " " ; S3 ; " " ; Prefix
      76. Waitms 100
      77. '---------------------------------------
      78. Return
      79. '=========================================================================0
      80. T1_irq:
      81. Timer1 = Timerwert
      82. If Servozaehler = 1 Then
      83. Servopin_1 = 1
      84. Timerwert = 45536
      85. Else
      86. Servopin_1 = 0
      87. Twert = Servo * 10
      88. Twert = Twert + 2000
      89. Timerwert = 0 - Twert
      90. End If
      91. '==========================================================================
      92. If Servozaehler = 2 Then
      93. Servopin_2 = 1
      94. Timerwert = 45536
      95. Else
      96. Servopin_2 = 0
      97. Twert = Servo * 10
      98. Twert = Twert + 2000
      99. Timerwert = 0 - Twert
      100. End If
      101. '=========================================================================
      102. Return
      Alles anzeigen
    • Schreib mal
      dim servo(2) as byte
      Damit legst du 2 bytes an, mit dem Namen servo(1) und servo(2).
      Ein array besteht aus Variablen, die mit einem Index durchnummeriert sind. Hier ist der Name servo und der Index geht von 1 bis 2.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      dim servo(2) as byte
      Ja, so sollte es natürlich oben stehen.

      2 wichtige Sachen noch:

      - Für den Servointerupt solltest du mein Beispiel oben nehmen, in deinem Beispiel gibt es kein Umschalten zwischen den Servos und keine definierte Pulspause.

      - Im Seriell-Interrupt keine LCD-Befehle. Der Interrupt muss so kurz wie möglich bleiben.
      LCD Ausgaben brauchen (im Vergleich) wahnsinnig viel Zeit und eine Wartezeit von 100ms ruiniert dir den Rest des Programms. Mach die Ausgabe ruhig in der Hauptschleife.


      siggimu schrieb:

      Muss ich dort dann Twert = Servo(prefix) * 10 schreiben ?
      ja, schau in mein Beispiel

      siggimu schrieb:

      Sollte ich da prefix = 0 festlegen ?
      besser prefix = 1, dann gibt es keine Probleme mit anderen Speicherstellen
    • Hier werden Anfangswerte berechnet, lass diese 3 Zeilen mal weg. Kann sein, dass es beim Programmstart einen Zappler an den servos gibt.
      Eine 0 als Index wäre hier schlecht. Ohne Angabe von config base beginnt der Index mit 1.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo, Ihr 2 - Danke, programmtechnisch gläuft es ohne Fehler !!!
      Das LCD hatte ich wegen der ankommenden Werte drin - habe es jetzt aber im irq rausgenommen.
      Hardwareseitig kann ich es erst heute abend testen.
      Noch eine Frage:
      kann ich im Irq noch Buttons wie folgt unterbringen?

      Button.jpg

      If Temp = "D" Then 'Innenbeleuchtung an/aus
      Goto M1
      '.....
      M1:
      If Val(s3) = 110 Then
      Ddrd.2 = 0
      End If
      If Val(s3) = 120 Then
      Ddrd.2 = 1
      End If
      '......
      Return
    • siggimu schrieb:

      kann ich im Irq noch Buttons wie folgt unterbringen?
      ja, klar ;)

      siggimu schrieb:

      If Val(s3) = 110 Then
      Ddrd.2 = 0
      End If
      Die Abfrage ist etwas unglücklich, das müsste der AVR erst String in Int umwandeln, hier wäre das besser:
      If S3 = "110" Then ...
      Allerdings solltest du dann nicht DDRD.x umschalten, sondern PortD.x ;)
      Es geht sicher noch etwas eleganter ;)