Bluetoothfähigen Taster mit Arduino bauen

Hallo zusammen,

habe schon sehr viel gestöbert zu dem Thema, aber noch nicht so wirklich brauchbare Informationen zu meinem Projekt gefunden und hoffe ihr könnt mir bei diesem Thema weiterhelfen.

Mein Projekt:

Ich möchte gerne mit einem kompakten Arduino ... und einem Bluetooth Modul folgendes realisieren...

  1. Ein Schalter/Taster wird gedrückt
  2. Arduino erkennt es
  3. Arduino sendet über Bluetooth als "HID Tastatur/Eingabegerät" den Tastendruck einer Leerzeichentaste (oder beliebig anderen Taste) an das gekoppelte Mobilgerät und löst so eine Aktion an diesem aus

wie kann ich das am besten realisieren?

habe bereits auch ein Produkt namens "Bluefruit EZ-Key) gefunden (siehe hier: Bluefruit EZ-Key - 12 Input Bluetooth HID Keyboard Controller [v1.2] : ID 1535 : $19.95 : Adafruit Industries, Unique & fun DIY electronics and kits) was genau das realisiert. Dies ist leider aber überall ausverkauft.

Ein Arduino Pro Mini habe ich bereits erfolgreich so programmiert, dass er über USB Kabel bei Tastendruck das "Leerzeichen" an mein Endgerät sendet, nur wie bekomme ich das ganze nun kabellos hin? :wink:

Hoffe ihr könnt mir helfen und bedanke mich bereits vorab schonmal für alle eure Antworten! :slight_smile:

VG Winni

Hallo,

du meinst mit "über USB" sicherlich, dass du das Zeichen über die serielle rausschickst?
Wenn ja, dann haste das damit schon erledigt.
Ein BT Modul hängt auch "nur" an der seriellen Schnittstelle. Du brauchst aber dann noch eine Software Serial. Dafür gibts eine Lib.
Für Dich als Programmierer bleibt es seriell. Nur das Übertragungsmedium ändert sich von Kabel zu Funk.

Z.Bsp. Bluetooth-Kochbuch für den Arduino | Arduino-Hannover

Hallo Doc! und vielen Dank für deine schnelle Antwort und den hilfreichen Link!

Seriell über USB Port ja... :wink:

d.h. ich hab es mir vielleicht einfach viel zu kompliziert vorgestellt?

Will ja eigentlich nicht wie im Link erreich das das Bluetooth Gerät meinen Arduino steuert sondern genau anders herum.... sollte aber nach dem gleichen Prinzip funktionieren, oder?

habe übrigens auch auf Youtube dieses Video hier entdeckt - YouTube

wo gezeigt wird wie ein Bluetooth Adapter für eine Tastatur mit altem PS2 Anschluss hergestellt wird (auch hier wird das mit dem Softserial gemacht)... wenn ich dieses Tutorial befolge und den Code leicht modifiziere sollte es mir möglich sein auf das Arduino meinen Ursprünglichen Code zu kopieren und Ihn über das Bluetooth Modul zu senden, oder?

Hätte aber noch eine kurze weitere Frage zur Spannungsversorgung:
Wenn ich an den VIN Pin eines Arduino Nano eine 9V Batterie anschließe....sollten doch die vorgeschalteten Spannungswandler Sie auf die korrekte Spannung für das Board herunterregeln...habe ich das richtig verstanden? oder würde ich mein Board damit plätten :wink:

Würde diese Variante gerne wählen um Platz zu sparen, da ich den Arduino samt Batterie gerne in das Gehäuse des Tasters integrieren möchte.... gibt es da noch andere Platzsparende Spannungsversorgungsmöglichkeiten?

Zum Schluss habe ich mir auch noch NFC Tags für mein Projekt geholt um den Taster dann einfach durch das dranhalten meines Endgerätes zu koppeln...

VG Winni

Wenn ich an den VIN Pin eines Arduino Nano eine 9V Batterie anschließe....sollten doch die vorgeschalteten Spannungswandler Sie auf die korrekte Spannung für das Board herunterregeln

Prinzipiell richtig.
Nachteil ist nur, dass 9V Blockbatterien keine allzu hohe Kapazität haben und auf dem Nano ein Linearregler ist, der die Differenz 9V-5V verheizt.

Hallo,

Software seriell benötigst du, weil die eine Hardware serielle Schnittstelle vom AVR mit USB zum programmieren/einfaches debuggen belegt/verbunden ist. Du könntest Pin 0/1 natürlich auch verwenden. Musst nur immer! daran denken, für das flashen deine externe Beschaltung an den Pins vorher abzustecken. Fast ein Unding, irgendwann vergisst man es. Es kann sein, muss nicht, dass dabei etwas schief geht.

VIN geht immer über den Spannungsregler. Auf dem Pro Mini auch als RAW bezeichnet.
.pdf Schematics: https://www.arduino.cc/en/Main/ArduinoBoardProMini
VCC wären dann die runtergeregelten 5V.
Allerdings wird die 9V Batterie nicht lange halten.
Ob es Sinn macht den µC in den Stromsparmodus zu legen weiß ich nicht.
Oder mittels kleinen Steckernetzteil?

Ein Knackpunkt wäre noch, daran bin ich auch bis heute gescheitert bzw. habe es dann nicht weiter verfolgt, mich vom Arduino aus mittels BT Master auf mein Smartphone bzw. BT Slave zu verbinden. Mit meinem Handy komme ich immer auf den Arduino mit BT Slave. Umgekehrt bekomme ich das nicht hin. Selbst vom Rechner aus ohne Arduino, BT Master direkt am Rechner und mittels Terminal schaff ich das nicht. Das würde ich an deiner Stelle zu erst angehen.

Hallo,

ich muss das denke ich nochmal präzisieren. Das Problem von dem ich rede dreht sich um das Pairing. Wenn die Verbindung steht, kann man natürlich von jeder Seite aus Daten hin und her schicken. Nur das Pairing selbst kann ich nur vom Smartphone aus anstoßen. Dann wird der BT Slave gefunden und alles ist gut.
Smartphone > Pairing ...... BT Slave am Rechner (okay)
Smartphone > Pairing ...... BT Slave am Arduino (okay)

Umgekehrt klappt das nicht. Wenn ich versuche mit einem BT Master vom Rechner oder Arduino aus mich mit dem Smartphone zu pairen, dann klappt das nicht.

Wünsche dennoch maximale Erfolge.
Das Forum ist ansonsten 24h am Tag offen. :slight_smile:

Hallo Doc,

nochmals supervielen Dank das du dir so eine Mühe machst! :slight_smile:

Habe heute nochmal einen groben Plan erarbeitet und werde morgen mit der Umsetzung beginnen....

hoffe mal es funktioniert...

als Stromquelle werde ich einen alten 3.7V Li-Io Handyakku nehmen...

werde euch auch auf dem laufenden halten.

VG Winni

Hallo nochmal,

irgendwie befinde ich mich gedanklich mit meinem Projekt in einer Sackgasse und hoffe ihr könnte mir aus Ihr heraushelfen.

Wie bereits von Doc hier erwähnt ist die Kommunikation, bzw. das Senden eines Tastatursignals (in meinem Falle "Leertaste") schwieriger als gedacht.

Was ich bereits erreicht habe ist, dass ich Kabelgebunden (über USB) über einen Arduino ein HID Keyboard Signal an mein Endgerät (Android Tablet) sendet, jedesmal wenn dort die Brücke von Pin 9 und GND geschlossen wird.

D.h. mein Endgerät denkt, dass eine USB Tastatur angeschlossen ist, obwohl es nur ein Arduino ist.

Nun wollte ich einfach die Kabelverbindung durch eine kabellose Bluetoothverbindung ersetzen, doch es gibt nun folgendes Problem --> mein Tablet erkennt das gesendete Bluetooth Signal nicht als HID Tastatur.

Habe mir aus diesem Grund jetzt den RN42 Bluetooth Module Chip gekauft.

Danach habe ich mir mit diesem Chip einen USB Bluetooth Adapter gebaut, welcher dazu dient normale Tastaturen und Mäuse (z.b. mit PS2 oder USB Anschluss) Bluetoothfähig zu machen.

Also sieht mein Momentanes Setup so aus:

Arduino (welcher die normale USB Tastaur simuliert)---> über USB Kabel verbunden mit ---> USB Tastatur zu Bluetooth Tastaturadapter --> verbunden über Bluetooth mit Androidtablet

dieses Zusammenstecken funktioniert ist aber vom Platz sehr Raumfordernd.

Jetzt habe ich folgende Frage an euch:

Wie schaffe ich es das Arduino Board des USB zu Bluetooth Adapters so zu konfigurieren das es selbstständig ein HID-Tastatursignal über Bluetooth sendet? (ich den zweiten Arduino also weglassen kann)

ich sozusagen beiden Codes zusammen auf ein Arduino vereint bekomme?

hier mal die Codes zum besseren Verständnis:

Code welcher das Arduino zur HID Tastatur macht und jedesmal ein Leerzeichen über USB sendet wenn Pin 9 und GND verbunden werden:

#include Keyboard.h 


int buttonPin = 9;  // Set a button to any pin

void setup()
{
  pinMode(buttonPin, INPUT);  // Set the button as an input
  digitalWrite(buttonPin, HIGH);  // Pull the button high
}

void loop()
{
  if (digitalRead(buttonPin) == 0)  // if the button goes low
  {
    Keyboard.write('z');  // send a 'z' to the computer via Keyboard HID
    delay(1000);  // delay so there aren't a kajillion z's
  }
}

und der Code bzw. Link zur Github Seite des Bluetooth Adapters von Evan Kale:

USB Keyboard zu Bluetooth Keyboard Adapter (Github)

* Copyright (c) 2015 Evan Kale
 * Email: EvanKale91@gmail.com
 * Website: www.ISeeDeadPixel.com
 *          www.evankale.blogspot.ca
 *
 * This file is part of ArduinoBTPS2.
 *
 * ArduinoBTPS2 is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
#include "PS2Mouse.h"
#include "PS2Keyboard.h"
#include "Bluetooth.h"

#define MOUSE_CLOCK 2
#define MOUSE_DATA 3
#define KEYBOARD_CLOCK 4
#define KEYBOARD_DATA 5

#define _DEBUG 0

#if _DEBUG
#define HARDWARE_SERIAL_RATE 38400
#else
#define HARDWARE_SERIAL_RATE 115200
#endif

PS2Mouse mouse(MOUSE_CLOCK, MOUSE_DATA);
PS2Keyboard keyboard(KEYBOARD_CLOCK, KEYBOARD_DATA);

#if _DEBUG
#define BLUETOOTH_DEBUG_RX 7
#define BLUETOOTH_DEBUG_TX 8
#define BLUETOOTH_DEBUG_BAUD 9600
Bluetooth bluetooth(BLUETOOTH_DEBUG_BAUD, true, BLUETOOTH_DEBUG_RX, BLUETOOTH_DEBUG_TX);
#else
Bluetooth bluetooth(HARDWARE_SERIAL_RATE, false, 0, 0);
#endif

void setup()
{
#if _DEBUG
	Serial.begin(HARDWARE_SERIAL_RATE);
	Serial.println("Setup started");
#endif

	delay(250);

#if _DEBUG
	Serial.println("Initializing mouse...");	
#endif

	bool mouseStatus = mouse.init();

#if _DEBUG
	if (mouseStatus)
		Serial.println("Mouse detected!");
	else
		Serial.println("No mouse detected.");

	Serial.println("Initializing keyboard...");
#endif

	bool keyboardStatus = keyboard.init();

#if _DEBUG
	if (keyboardStatus)
		Serial.println("Keyboard detected!");
	else
		Serial.println("No keyboard detected.");

	Serial.println("Setup complete");
#endif
}

void loop()
{
	if (mouse.available())
	{
		bluetooth.sendMouseState(mouse.getBtnState(), mouse.getDeltaX(), -mouse.getDeltaY(), -mouse.getDeltaZ());
	}

	if (keyboard.available())
	{
		bluetooth.sendKeyboardState(keyboard.getKeyModifiers(), keyboard.getKeysPressed());
	}

}

Vielen Dank für Eure Hilfe!!!!!!!!

VG Winni

Hallo,

Kabel gebunden funktioniert es wie gewünscht nur mit Funk nicht?
Weil im ersten Sketch fehlt mir irgendwie im setup Serial.begin, kann aber schon in der Lib enthalten sein. Das Pairing funktioniert? Also auf deinem Tablet siehst du den anderen Adapter als gekoppelt?

Hallo Doc,

vielen Dank das du immer noch an meinem Thema dranbleibst! :slight_smile:

Also...Arduino mit Tablet über USB Kabel verbunden funktioniert wunderbar. Ich drücke den Taster und auf meiner Schrift Eingabezeile im Tablet erscheint der gewünschte Buchstabe...bzw ein Leerzeichen...

Auch die Kopplung funktioniert. D.h. Tablet und Bluetoothmodul verbinden sich nach eingabe des Passwortes miteinander.

Bevor ich vllt zu kompliziert und über drei Ecken denke...frage ich ganz blöd nochmal nach:

Wie müsste der Code aussehen, bzw wie müsste ich mein Arduino verkabeln, dass er einfach statt seriell über USB das ganze über Bluetooth sendet?

hast du eine Idee?

Danke nochmals für deine Hilfe!

VG Winni

Hab noch keine große Erfahrung in dem Bereich, aber meine hc-05 (?) Module geben sich als Comport am Win10 Tablett aus. Kann man dem Modul nicht sagen, dass es ein Keyboard ist ?

Leider nein, das HC05 ist nicht HID fähig...das Bluesmirf von Sparkfun aber schon....

am Einfachsten wäre es, wenn ich mir das "Bluefruit EZ-Key HID" Device von Adafruit kaufe, denn das macht genau das was ich vorhabe.

Leider ist es schon seid Ewigkeiten überall ausverkauft >:( >:( >:( >:(

Hallo,

ohne jetzt die Keyboard / HID Problematik zu beachten, damit kenne ich mich nicht aus, folgendes.

Auf jeden Fall müßtest du etwas in einer Terminal App auf dem Tablet empfangen.
Wenn das ginge und du die gesendeten Zeichen empfängst wie abgeschickt, dann steht die Verbindung.
Dann käme das HID Problem "oben drauf".

Du müßtest das BT Modul nur an die 2 Pins der seriellen anschließen. Ohne Änderungen im Sketch an Pin 0/1.
Das wäre dann die übliche Hardware serielle aller Arduinos. Wie gesagt, vorsicht beim flashen!, externes abstecken.
Falls du nicht schon eine software serielle verwenden solltest.

Das BT Modul mußte ggf. konfigurieren und beachten das es mit 3,3V arbeitet.
Laut deinem Link in #7 hat es default eine Baudrate von 115200.
Das müßtest du allerdings noch im Sketch einstellen.
Abweichend davon zum konfigurieren von dem Teil mußte den Command Mode aktivieren usw.

Um von Arduinoboard 5V auf 3,3V inkl. Toleranzbereich zu kommen hatte ich einfach 2 Dioden in die Spannungsversorgung verbaut.
Oder nimmst erstmal 3 Dioden, misst nach oder baust dir was mit Z-Diode drumrum.
RX/TX über kreuz an Arduino RX/TX.
TX vom BT Modul kannste direkt mit dem Arduino 5V verbinden. 3V werden als High erkannt. Das klappt.
RX vom BT Modul mußte mit Spannungsteiler an den Arduino klemmen.
Sonst würden die 5V Signalpegel ggf. den BT Modul RX Eingang killen.
Dafür kannste 1k und 2k Widerstand als Spannungsteiler nehmen.

Hallo zusammen,

so laaaangsam fängt das Projekt an meine Nerven zu strapazieren :slight_smile: :slight_smile: :slight_smile:

habe heute beim Uploaden des Codes per USB vergessen RX/TX zu trennen...und ausgerechnet in dem Code keinen Softserial eingebaut... jetzt erkennt der PC natürlich nicht mehr den richtigen Port.... so ein mist....

gibt es eine Möglichkeit dies wieder zurück zu korrigieren? oder darf ich mir gleich ein neues Board kaufen?

habe mich nun auch entschlossen einen etwas anderen Weg zu wählen...und zwar mit zwei Arduinos und zwei HC05 Bluetooth Modulen, welche ich als Master und Slave einsetzen möchte, so dass der grobe Plan nun so aussehen sollte (basierend auf folgendem Tutorial):

Master und Slave HC05 konfigurieren

Master Arduino ist samt BT-Modul im Taster verbaut.

Zweites Arduino samt BT Modul (Slave) ist mit dem Master gekoppelt und per USB Kabel am Tablet angeschlossen.

Taster wird gedrückt --> Master sendet Signal/Commando "1" an den Slave --> Slave erkennt dies und soll anstatt einer LED zum Leuchten zu bringen --> Pin 9 am zweiten Arduino aktivieren --> welcher dann als Fake HID Tastatur über die serielle USB Schnittstelle das Leerzeichen ans Tablet sendet...

wie müsste denn hierfür der Code aussehen?

habe hier einen einfachen Master/ Slave Code für gefunden, der eigentlich dafür gedacht ist eine LED und einen Servo zu steuern:

Master Code:

/*
 * How to configure and pair two HC-05 Bluetooth Modules
 * by Dejan Nedelkovski, www.HowToMechatronics.com
 * 
 *                 == MASTER CODE ==
 */
#define ledPin 9
int state = 0;
int potValue = 0;
void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(38400); // Default communication rate of the Bluetooth module
}
void loop() {
 if(Serial.available() > 0){ // Checks whether data is comming from the serial port
    state = Serial.read(); // Reads the data from the serial port
 }
 // Controlling the LED
 if (state == '1') {
  digitalWrite(ledPin, HIGH); // LED ON
  state = 0;
 }
 else if (state == '0') {
  digitalWrite(ledPin, LOW); // LED ON
  state = 0;
 }
 // Reading the potentiometer
 potValue = analogRead(A0);
 int potValueMapped = map(potValue, 0, 1023, 0, 255);
 Serial.write(potValueMapped); // Sends potValue to servo motor
 delay(10);
}

Slave Code:

/*
 * How to configure and pair two HC-05 Bluetooth Modules
 * by Dejan Nedelkovski, www.HowToMechatronics.com
 * 
 *                 == SLAVE CODE ==
 */
 
#include <Servo.h>
#define button 8
Servo myServo;
int state = 20;
int buttonState = 0;
void setup() {
  pinMode(button, INPUT);
  myServo.attach(9);
  Serial.begin(38400); // Default communication rate of the Bluetooth module
}
void loop() {
 if(Serial.available() > 0){ // Checks whether data is comming from the serial port
    state = Serial.read(); // Reads the data from the serial port
 }
 // Controlling the servo motor
 myServo.write(state);
 delay(10);
 
 // Reading the button
 buttonState = digitalRead(button);
 if (buttonState == HIGH) {
   Serial.write('1'); // Sends '1' to the master to turn on LED
 }
 else {
   Serial.write('0');
 }  
}

Verkabelung:

Nochmals vielen vielen Dank an alle Helfer!!!

LG und guten Beschluss!

Winni

winnerger:
habe heute beim Uploaden des Codes per USB vergessen RX/TX zu trennen...und ausgerechnet in dem Code keinen Softserial eingebaut... jetzt erkennt der PC natürlich nicht mehr den richtigen Port.... so ein mist....

gibt es eine Möglichkeit dies wieder zurück zu korrigieren? oder darf ich mir gleich ein neues Board kaufen?

Hallo,

solange beim flashen nichts total schief ging, kannste versuchen das nackte Arduinoboard mit dem IDE Bsp. Blink Sketch zu flashen.
Wenn das klappt, ist alles i.O. Denn die Daten zum flashen laufen von USB über den USB-Serial Wandler zu den RX/TX Pins 0/1 an den µC. Das heißt, wenn die LED13 schön blinkt, hat auch das flashen funktioniert was bedeutet es ist alles heile geblieben.

Dabei dürfte an sich nix kaputt gegangen sein. Aber zum neu flashen alles was an rx/tx hängt, abziehen

Also das Flashen neuer Codes geht....mit einem Trick.... (habe ein Sparkfun Pro Micro)...

ansich wird es, wenn ich es per USB an meinen Laptop anschließe und Arduino IDE öffne nicht als COM Port angezeigt.

Mache ich aber einen Reset, indem ich die Pins RST+GND zweimal schnell hintereinander betätige wird es als mit dem richtigen COM Port für 8 sek lang angezeigt und ich kann einen Code übertragen....

D.h. der Fehler liegt bei Windows, oder? wie bekomme ich es denn hin, dass ihm wieder der richtige COM Port dauerhaft zugeordnet wird?

LG Winni

Hallo,

wie hast du den Sparkfun Pro Micro "vorher" geflasht?
Weil die 8sec scheinen normal zu sein bei dem Teil.

Bei meinem verbauten original Arduino Micro war das nicht so, den konnte ich normal flashen wie immer.

vorher konnte ich ihn nach der Installation der Treiber ganz normal anstecken und der richtige COM Port wurde erkannt... und ich konnte Ihn ganz normal über Arduino IDE Programmieren....

wenn ich Ihn jetzt einstecke...erscheint immer nur die Warnung USB-Gerät wurde nicht erkannt...und somit ist dann der Port in Arduino IDE nicht sichtbar....

wenn ich jetzt wie du gepostet hast...zweimal kurz hintereinander RST+GND drücke kommt die Arduino Leonardo Bootloader Sequenz und er wird als Leonardo im Gerätemanager angezeigt...bevor er dann nach 8 sek wieder als Unbekanntes USB Gerät angezeigt wird...

:frowning: >:( >:( >:(

Hallo,

dazu kann ich leider nichts sagen. Ist seltsam, zugegeben.
Auf der einen Seite wäre es laut Beschreibung normal mit den 8sec und auf anderen hat sich was geändert, wenn man ihn vorher normal flashen konnte. Wenn niemand eine Idee hat, schreib mal Sparkfun an mit den Hinweis dass du ihn vorher normal flashen konntest und was man machen kann damit das wieder so funktioniert.

Die These das der Bootloader eine Treffer weg hat, würde ich nicht aufstellen, weil dann würde nichts mehr funktionieren.

Du kannst aber den Treiber deinstallieren im Gerätemanager und mal neu installieren. Vielleicht hilft es. Keine Ahnung.

Davon abgesehen, konnte ich den Micro eh nie leiden. Weil das mit der seriellen total bekloppt ist. Mir als Anwender nützt es nichts das USB nativ verbaut ist. Weil man die Schnittstelle im Sketch richtig ansprechen möchte, muss man ja das schreiben.

void setup()  { 
  Serial.begin(9600);
  while (!Serial) {;} // für 32U4, wait for serial port to connect, needed for native USB.

Lässt man den Code so und startet ihn ohne Kabel zum Rechner neu, dann bleibt er genau dort in der while hängen bis man ihn einmal verbindet. Ich brauchte die serielle nur zum debuggen und bin bald blöde gewurden. Ich war nur am umflashen.