Bluetooth-kontroll. Arduino-lektioner: styra enheter från en smartphone för dummies Styra ett Bluetooth-relä på Android
Arduino-maskin styrd av en Android-enhet via Bluetooth - applikationskod och MK (del 2)
Om den första delen
I den första delen beskrev jag den fysiska delen av designen och bara en liten bit kod. Låt oss nu titta på mjukvarukomponenten - en Android-applikation och en Arduino-skiss.Först kommer jag att ge en detaljerad beskrivning av varje ögonblick, och i slutet kommer jag att lämna länkar till hela projekten + en video av resultatet, vilket borde göra dig besviken och uppmuntra.
Android-applikation
Android-programmet är uppdelat i två delar: den första är att ansluta enheten via Bluetooth, den andra är styrspaken.Jag varnar dig - designen av applikationen var inte genomarbetad alls och gjordes på ett klumpigt sätt, bara för att få det att fungera. Förvänta dig inte anpassningsförmåga och UX, men det ska inte gå utöver skärmen.
Layout
Startaktiviteten baseras på layouten, element: knappar och layout för listan över enheter. Knappen startar processen att hitta enheter med aktiv Bluetooth. Listvyn visar de hittade enheterna.
Kontrollskärmen förlitar sig på en layout som bara har en knapp, som i framtiden kommer att bli en joystick. Knappen, genom bakgrundsattributet, har en stil kopplad till den som gör den rund.
TextView används inte i den slutliga versionen, men den lades ursprungligen till för felsökning: nummer skickade via Bluetooth visades. I det inledande skedet råder jag dig att använda. Men sedan kommer siffrorna att börja beräknas i en separat tråd, från vilken det är svårt att komma åt TextView.
Filen button_control_circle.xml (stil), den måste placeras i den ritbara mappen:
Du måste också skapa en fil item_device.xml, den behövs för varje element i listan:
Manifest
För säkerhets skull kommer jag att tillhandahålla hela manifestkoden. Du måste få full tillgång till bluetooth genom användningsbehörighet och glöm inte att ange den andra aktiviteten med hjälp av aktivitetstaggen.
Huvudaktivitet, parning av Arduino och Android
Vi ärver klassen från AppCompatActivity och deklarerar variabler:Public class MainActivity utökar AppCompatActivity (privat BluetoothAdapter bluetoothAdapter; privat ListView listView; privat ArrayList
Jag kommer att beskriva onCreate()-metoden rad för rad:
@Åsidosätt skyddat void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); //required line //bifoga den tidigare skapade markup-setContentView(R.layout.activity_main); //länka knappen från markupknappen ButtonStartFind = (Button ) findViewById( R.id.button_start_find); //länk layouten där de hittade enheterna kommer att visas listView = (ListView) findViewById(R.id.list_device); //ställ in klickåtgärdsknappenStartFind.setOnClickListener(ny vy. OnClickListener() ( @ Override public void onClick(View v) ( //om behörigheter erhålls (funktion nedan) if(permissionGranted()) ( //adapter för bluetooth-kontroll bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(bluetoothEnabled() ) ( //om bluetooth aktiverat (funktion nedan) findArduino(); //börja söka efter en enhet (funktion nedan) ) )); //haka på knappen för att gå till kontrollknappenStartControl = (Button) findViewById(R.id .button_start_control); buttonStartControl.setOnClickListener( new View.OnClickListener() ( @Override public void onClick(View v) ( //objekt för att starta nya aktiviteter Intent intent = new Intent(); //binda till kontrollaktiviteten intent.setClass(getApplicationContext(), ActivityControl.class); //stäng den här aktiviteten, öppna kontrollskärmen startActivity(intent); ) )); )
Följande funktioner kontrollerar om behörighet att använda bluetooth har erhållits (utan användartillstånd kommer vi inte att kunna överföra data) och om bluetooth är aktiverat:
Private boolean permissionGranted() ( //om båda behörigheterna beviljas, returnera true if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.BLUETOOTH) == PermissionChecker.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getApplication.Context(.), Manifest.permission.BLUETOOTH) BLUETOOTH_ADMIN ) == PermissionChecker.PERMISSION_GRANTED) ( return true; ) else ( ActivityCompat.requestPermissions(this, new String (Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN), 0); return false;() ( //om bluetooth är aktiverat, returnera true, om inte, be artigt användaren att aktivera den if(bluetoothAdapter.isEnabled()) ( return true; ) else ( Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE(); startActivityForResult enableBtIntent, 0); return false; ) )
Om alla kontroller godkänns börjar sökningen efter enheten. Om ett av villkoren inte är uppfyllt, kommer ett meddelande att visas som säger "Tillåter/aktiverar du?", och detta kommer att upprepas tills testet är godkänt.
Att söka efter en enhet är uppdelat i tre delar: förbereda listan, lägga till hittade enheter i listan, upprätta en anslutning till den valda enheten.
Privat void findArduino() ( //få en lista över tillgängliga enheter Set
När Bluetooth-modulen som är monterad på Arduino (mer om detta senare) hittas kommer den att visas i listan. Genom att klicka på den börjar du skapa en socket (du kan behöva vänta 3-5 sekunder efter att du klickat eller klicka igen). Du kommer att förstå att anslutningen har upprättats av lysdioderna på Bluetooth-modulen: utan en anslutning blinkar de snabbt, när det finns en anslutning minskar frekvensen märkbart.
Styr och skicka kommandon
När anslutningen är upprättad kan du gå vidare till den andra aktiviteten - ActivityControl. Det kommer bara att finnas en blå cirkel på skärmen - en joystick. Den är gjord av en vanlig knapp, markeringen visas ovan.Public class ActivityControl utökar AppCompatActivity ( //variabler som kommer att behövas privat knappknappDriveControl; privat float BDHeight, BDCwidth; privat float centerBDCheight, centerBDCwidth; privat String angle = "90"; //0, 30, 60, 90, 120, 15 , 180 privat ConnectedThread threadCommand; privat long lastTimeSendCommand = System.currentTimeMillis(); )
All huvudåtgärd sker i metoden onCreate():
//utan denna rad kommer studion att kräva att du manuellt åsidosätter performClick()-metoden //vi behöver den inte @SuppressLint("ClickableViewAccessibility") @Override protected void onCreate(Bundle savedInstanceState) ( //required line super. onCreate(savedInstanceState); //set markup, dess kod är ovanför setContentView(R.layout.activity_control); //bind knappen buttonDriveControl = (Button) findViewById(R.id.button_drive_control); //få information om knappen final ViewTreeObserver vto = buttonDriveControl.getViewTreeObserver() ; BDCwidth = buttonDriveControl.getWidth(); //hitta knappens mitt i pixlar(!) centerBDCheight = BDCheight/2; centerBDCwidth = BDCwidth/2; //inaktivera GlobalListener, det kommer inte längre att behövas buttonDriveControl.getViewTreeObserver() .removeOnGlobalLayoutListener(detta); ) )); //installera en lyssnare som kommer att fånga beröring //dess kod presenteras nedan buttonDriveControl.setOnTouchListener(nya ControlDriveInputListener()); //skapa en ny tråd, den kommer att vara upptagen med att skicka data //som en parameter passerar vi socket som skapades i den första aktiviteten //trådkoden presenteras nedan threadCommand = new ConnectedThread(MainActivity.clientSocket); threadCommand.run(); )
Observera (!) - vi tar reda på hur många pixlar knappen upptar. Tack vare detta får vi anpassningsförmåga: storleken på knappen kommer att bero på skärmupplösningen, men resten av koden kommer lätt att anpassa sig till detta, eftersom vi inte fixar storlekarna i förväg. Senare kommer vi att lära applikationen att känna igen var beröringen var och sedan översätta detta till värden från 0 till 255 som är förståeliga för Arduino (trots allt kan beröringen vara 456 pixlar från mitten, och MK kommer inte att fungera med ett sådant nummer).
Nedan finns koden för ControlDriveInputListener(), denna klass ligger i klassen för själva aktiviteten, efter metoden onCreate(). Väl i ActivityControl-filen blir ControlDriveInputListener-klassen en barnklass, vilket innebär att den har tillgång till alla variabler i huvudklassen.
Ignorera funktionerna som anropas när du klickade på dem för tillfället. Nu är vi intresserade av processen att fånga beröring: vid vilken tidpunkt placerade personen fingret och vilken information vi kommer att få om det.
Observera att jag använder klassen java.util.Timer: den låter dig skapa en ny tråd som kan ha en fördröjning och upprepa ett oändligt antal gånger var x antal sekunder. Det bör användas för följande situation: en person placerade fingret, ACTION_DOWN-metoden fungerade, informationen gick till arduino, och efter det bestämde personen sig för att inte röra fingret, eftersom hastigheten passar honom. ACTION_DOWN-metoden kommer inte att fungera andra gången, eftersom du först måste ringa ACTION_UP (ta bort fingret från skärmen).
Tja, vi startar en loop i klassen Timer() och börjar skicka samma data var 10:e millisekund. När fingret flyttas (ACTION_MOVE kommer att fungera) eller höjs (ACTION_UP), måste timerslingan dödas så att data från den gamla pressen inte börjar skickas igen.
Offentlig klass ControlDriveInputListener implementerar View.OnTouchListener (privat timertimer; @Override public boolean onTouch(View view, MotionEvent motionEvent) ( //få beröringspunkter i pixlar //räknat från det övre vänstra hörnet (!) final float x = motionEvent.getX (); final float y = motionEvent.getY(); //ta reda på vilken åtgärd som vidtogs switch(motionEvent.getAction()) ( //om du trycker på //det kommer alltid att fungera när du trycker på knappen MotionEvent.ACTION_DOWN: //skapa en timertimer = new Timer(); //starta loopen //argument indikerar: fördröjning mellan repetitioner 0, //repetera var 10:e millisekund timer.schedule(new TimerTask() ( @Override public void run() ( // överväg funktionen nedan calculateAndSendCommand(x, y); ) ), 0, 10); break; //om fingret flyttades (kommer att avfyras efter ACTION_DOWN) fall MotionEvent.ACTION_MOVE: //required (!) //if Timer-loopen lanserades tidigare (), vi slutför den if(timer != null) ( timer.cancel(); timer = null; ) //skapa en ny looptimer = new Timer(); //skicka data med samma frekvens tills ACTION_UP triggas timer.schedule(new TimerTask() ( @Override public void run() ( calculateAndSendCommand(x, y); ) ), 0, 10); ha sönder; //om fingret tas bort från skärmfallet MotionEvent.ACTION_UP: //kill the loop if(timer != null) ( timer.cancel(); timer = null; ) break; ) returnera falskt; ) )
Observera igen: metoden onTouch() räknar x och y från det övre vänstra hörnet av vyn. I vårt fall finns punkten (0; 0) vid knappen här:
Nu när vi har lärt oss hur man får den faktiska platsen för fingret på knapparna, låt oss ta reda på hur man konverterar pixlar (trots allt är x och y exakt avståndet i pixlar) till arbetsvärden. För att göra detta använder jag metoden calculateAndSendCommand(x, y), som måste placeras i klassen ControlDriveInputListener. Vi kommer också att behöva några hjälpmetoder; vi skriver dem i samma klass efter calculateAndSendCommand(x, y).
Privat void calculateAndSendCommand(float x, float y) ( //alla metoder beskrivs nedan //få de nödvändiga värdena //quarter - 1, 2, 3, 4 //för att förstå vad jag menar, dra koordinaterna genom mitten av knappen //och ja, den kommer inte att användas vidare, men den var användbar för att felsöka int quarter = identifiQuarter(x, y); //funktionen omvandlar avvikelsen från mitten till hastighet // subtrahera y för att få antalet pixlar från mitten av knappen int speed = speedCalculation(centerBDCheight - y); //bestämmer rotationsvinkeln //kom ihåg den första delen av artikeln, vi har 7 vinkelalternativ String angle = angleCalculation(x); / /om du vill visa information på skärmen, använd den här metoden //men det finns inte i den slutliga versionen kommer att fungera eftersom det påverkar en separat tråd /*String resultDown = "x: "+ Float.toString(x) + " y: " + Float.toString(y) + " qr: " + Integer.toString(quarter) + "\ n" + "height: " + centerBDCheight + " width: " + centerBDCwidth + "\n" + "hastighet : " + Integer.toString(hastighet) + " vinkel: " + vinkel; */ //viewResultTouch.setText(resultDown); //all data mottagen, du kan skicka den //men det kostar inte oftare (och inte mindre ofta) än 100 millisekunder if((System.currentTimeMillis() - lastTimeSendCommand) > 100) ( //vi överväger funktionen ytterligare threadCommand.sendCommand (Integer.toString(hastighet), vinkel); //skriv över tiden för den senaste datan som skickades lastTimeSendCommand = System.currentTimeMillis(); ) ) privat int identifiQuarter(float x, float y) ( //se hur punkten är placerad i förhållande till mitten // returnera vinkeln if(x > centerBDCwidth && y > centerBDCheight) ( return 4; ) else if (x< centerBDCwidth && y >centerBDCheight) ( return 3; ) else if (x< centerBDCwidth && y < centerBDCheight) {
return 2;
} else if (x >centerBDCwidth && y< centerBDCheight) {
return 1;
}
return 0;
}
private int speedCalculation(float deviation) {
//получаем коэффициент
//он позволит превратить пиксели в скорость
float coefficient = 255/(BDCheight/2);
//высчитываем скорость по коэффициенту
//округляем в целое
int speed = Math.round(deviation * coefficient);
//если скорость отклонение меньше 70, ставим скорость ноль
//это понадобится, когда вы захотите повернуть, но не ехать
if(speed >0 && hastighet< 70) speed = 0;
if(speed < 0 && speed >- 70) hastighet = 0; //ingen mening med att skicka hastighet under 120 //för låg, hjulen börjar inte snurra om(hastighet< 120 && speed >70) hastighet = 120; if(hastighet > -120 && hastighet< -70) speed = -120;
//если вы унесете палец за кнопку, ACTION_MOVE продолжит считывание
//вы сможете получить отклонение больше, чем пикселей в кнопке
//на этот случай нужно ограничить скорость
if(speed >255) hastighet = 255; om (hastighet< - 255) speed = -255;
//пометка: скорость >0 - går framåt,< 0 - назад
return speed;
}
private String angleCalculation(float x) {
//разделяем ширину кнопки на 7 частей
//0 - максимально влево, 180 - вправо
//90 - это когда прямо
if(x < BDCwidth/6) {
angle = "0";
} else if (x >BDCwidth/6 && x< BDCwidth/3) {
angle = "30";
} else if (x >BDCwidth/3 && x< BDCwidth/2) {
angle = "60";
} else if (x >BDCwidth/2 && x< BDCwidth/3*2) {
angle = "120";
} else if (x >BDCwidth/3*2 && x< BDCwidth/6*5) {
angle = "150";
} else if (x >BDCwidth/6*5 && x< BDCwidth) {
angle = "180";
} else {
angle = "90";
}
return angle;
}
När data har beräknats och översatts kommer den andra tråden in i bilden. Han ansvarar för att skicka information. Du kan inte klara dig utan det, annars kommer socket som sänder data att sakta ner inspelningen av beröringar, en kö kommer att skapas och det är slutet på allt.
ConnectedThread-klassen finns också i ActivityControl-klassen.
Privat klass ConnectedThread utökar tråden ( privat slutlig BluetoothSocket-socket; privat slutlig OutputStream-utgångStream; public ConnectedThread(BluetoothSocket btSocket) ( //get the socket this.socket = btSocket; //skapa en strömtråd för att skicka data till Arduino OutputStream os = null OutputStream os ; prova ( os = socket.getOutputStream(); ) catch(Undantag e) () outputStream = os; ) public void run() ( ) public void sendCommand(Stränghastighet, Strängvinkel) ( //bluetooth kan bara skicka bytes, så vi översätter byte speedArray = speed.getBytes(); byte angleArray = angle.getBytes(); //tecken används för separation //hur detta fungerar kommer du att förstå när du tittar på mottagningskoden för Arduino-skissen String a = "#"; String b = " @"; String c = "*"; försök ( outputStream.write(b.getBytes()); outputStream.write(speedArray); outputStream.write(a.getBytes()); outputStream .write(c.getBytes() ); outputStream.write(angleArray); outputStream.write(a.getBytes()); ) catch(Undantag e) () ) )
Sammanfattning av Android-applikationen
Jag ska kort sammanfatta allt det krångliga som beskrivs ovan.- I ActivityMain konfigurerar vi bluetooth och upprättar en anslutning.
- I ActivityControl binder vi knappen och får data om den.
- Vi fäster en OnTouchListener på knappen, den känner av beröring, rörelse och lyft av fingret.
- Vi omvandlar mottagna data (en punkt med x- och y-koordinater) till en rotationsvinkel och hastighet
- Skicka data separerade med specialtecken
Arduino skiss
Android-applikationen har plockats isär, skrivits, förstått... och nu blir det enklare. Jag ska försöka titta på allt steg för steg, och sedan ger jag dig en länk till hela filen.Variabler
Låt oss först titta på konstanterna och variablerna som kommer att behövas.#omfatta
setup() metod
I setup()-metoden ställer vi in parametrarna för stiften: de kommer att fungera som input eller output. Vi kommer också att ställa in kommunikationshastigheten mellan datorn och Arduino, och Bluetooth med Arduino.Void setup() ( pinMode(dirLeft, OUTPUT); pinMode(speedLeft, OUTPUT); pinMode(dirRight, OUTPUT); pinMode(speedRight, OUTPUT); pinMode(pinRed, INPUT); pinMode(pinBlack, INPUT); pinMode(pinWhite); , INPUT); pinMode(pinAngleStop, OUTPUT); pinMode(angleDirection, OUTPUT); pinMode(angleSpeed, OUTPUT); //denna hastighet är endast relevant för HC-05-modellen //om du har en modul av en annan version, se dokumentationen BTSerial.begin (38400); //denna hastighet är konstant Serial.begin(9600); )
loop() metod och ytterligare funktioner
Den kontinuerligt upprepande loop()-metoden läser data. Låt oss först titta på huvudalgoritmen och sedan de funktioner som är involverade i den.Void loop() ( //om det finns åtminstone olästa byte if(BTSerial.available() > 0) ( //läs den sista olästa byten char a = BTSerial.read(); if (a == "@") ( //om det är lika med @ (ett tecken jag valt slumpmässigt) //återställ variabeln val val = ""; //indikerar att vi nu räknar hastigheten readSpeed = true; ) else if (readSpeed) ( //om det är dags att läsa hastigheten och byten inte är lika med en hash / /lägg till en byte till val if(a == "#") ( //om byten är lika med en hash, är hastighetsdatan över //utgång till portmonitorn för felsökning av Serial.println(val); //indikerar att vi inte längre läser hastigheten readSpeed = false; //passera den mottagna hastigheten till drivfunktionen go(val.toInt( )); //reset val val = ""; //gå ur slingan för att läsa nästa byte retur; ) val+=a; ) else if (a == "*") ( //börja läsa rotationsvinkeln readAngle = true; ) else if (readAngle) ( //om det är en hash, så avslutar vi att läsa vinkeln //tills det är en hash, lägg till värdet till val if(a == "#") ( Serial.println( val); Serial.println("-----"); readAngle = falskt; //passa värdet till rotationsfunktionen turn(val.toInt()); val= ""; lämna tillbaka; ) val+=a; ) //get tiden för den senaste datamottagningen lastTakeInformation = millis(); ) else ( //om det inte finns några olästa bytes och de inte har funnits där på mer än 150 millisekunder //stäng av motorerna if(millis() - lastTakeInformation > 150) ( lastTakeInformation = 0; analogWrite(angleSpeed, 0) ; analogWrite(speedRight, 0); analogWrite(speedLeft, 0); ) ) )
Vi får resultatet: från telefonen skickar vi bytes i stil med "@speed#angle#" (till exempel ett typiskt kommando "@200#60#". Denna cykel upprepas var 100:e millisekund, eftersom vi på Android ställer in detta exakta intervall för att skicka kommandon. Kort sagt, gör det ingen mening, eftersom de kommer att börja bilda en kö, och om du gör det längre, kommer hjulen att börja röra sig ryckigt.
Alla fördröjningar genom kommandot delay(), som du kommer att se nedan, valdes inte genom fysiska och matematiska beräkningar, utan experimentellt. Tack vare alla fastställda jams, kör bilen smidigt, och alla lag hinner öva (strömmarna hinner gå igenom).
Slingan använder två sidofunktioner, de tar mottagen data och får bilen att röra sig och snurra.
Void go(int mySpeed) ( //om hastigheten är högre än 0 if(mySpeed > 0) ( //go forward digitalWrite(dirRight, HIGH); analogWrite(speedRight, mySpeed); digitalWrite(dirLeft, HIGH); analogWrite(speedLeft, mySpeed ); ) else ( //och om mindre än 0, sedan tillbaka digitalWrite(dirRight, LOW); analogWrite(speedRight, abs(mySpeed) + 30); digitalWrite(dirLeft, LOW); analogWrite(speedLeft, abs(mySpeed) + 30 ); ) delay(10); ) void turn(int angle) ( //applicera ström på pluset av vinkeldeterminanten digitalWrite(pinAngleStop, HIGH); //ge en fördröjning så att strömmen har tid för att avgöra fördröjning(5); //om vinkeln är 150 och mer, sväng höger //om 30 eller mindre, sedan vänster //intervallet från 31 till 149 är kvar för rak rörelse if(vinkel > 149) ( / /om vitt är stängt, men svart och rött är öppet //då har ytterläget nåtts, Du kan inte vrida det ytterligare //vi avslutar funktionen via retur if(digitalRead(pinWhite) == HIGH && digitalRead(pinBlack ) == LOW && digitalRead(pinRed) == LOW) ( return; ) //om kontrollen för den maximala vinkeln passeras // snurra hjulen digitalWrite(angleDirection, HIGH); analogWrite(angleSpeed, speedTurn); ) annat om (vinkel< 31) {
if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) {
return;
}
digitalWrite(angleDirection, LOW);
analogWrite(angleSpeed, speedTurn);
}
//убираем питание
digitalWrite(pinAngleStop, LOW);
delay(5);
}
Du ska inte vända när androiden skickar data om att användaren har tryckt på vinkeln 60, 90, 120, annars kommer du inte att kunna köra rakt. Ja, du kanske inte borde ha skickat ett kommando omedelbart att vända från Android om vinkeln är för liten, men det här är på något sätt klumpigt enligt min mening.
Resultat av skissen
Skissen har bara tre viktiga steg: att läsa kommandot, bearbeta rotationsbegränsningarna och mata ström till motorerna. Allt låter enkelt, och det är lättare att utföra än enkelt, även om det tog lång tid att skapa och var klumpigt.1 Beskrivning bluetooth-modul HC-06
Det finns ett stort antal implementeringar av Bluetooth-moduler. Var och en har sina egna egenskaper, men i allmänhet är de alla väldigt lika. Låt oss överväga en representant för Bluetooth-modulfamiljen HC-06, som kan köpas till ett bra pris på denna sida.
Denna modul arbetar på en frekvens från 2,40 GHz till 2,48 GHz och stöder Bluetooth-specifikationen version 2.1+EDR: minskad strömförbrukning, ökad nivå av dataskydd och enkel anslutning av Bluetooth-enheter. Stabil mottagning med modulen garanteras inom 10 meter.
Syftet med bluetooth-modulstiften är följande:
De två sista stiften får inte användas; Du kan ofta hitta moduler utan dessa stift alls.
2 Kopplingsschema bluetooth-modul för Arduino
Låt oss ansluta bluetooth-modulen till Arduino enligt diagrammet nedan. Observera att sändaren (Tx) på Arduino är ansluten till modulens mottagare (Rx) och vice versa.
På utgång Status En hög nivå visas när modulen är ihopparad med en annan Bluetooth-enhet och en låg nivå när den inte är ihopparad. Du kan avläsa dess värde genom att ansluta den till Arduino-stiftet och tilldela den ett driftläge pinMode(pinStatus, INPUT) och på så sätt ta reda på modulens status. Men statusindikatorn fungerar inte korrekt på alla moduler, så vi kommer inte att använda den i det här exemplet.
Resultatet ska se ut ungefär som bilden.
3 Skiss för Arduino för arbete via bluetooth
Låt oss skriva följande skiss och ladda den i Arduino-minnet:
Const int ledPin = 13; // utdata från den inbyggda LED-char incomingbyte; // variabel för Bluetooth-data void setup() ( pinMode(ledPin, OUTPUT); Serial.begin(9600); ) void loop() ( if (Serial.available() > 0) ( // om porten är tillgänglig incomingbyte = Serial.read(); // läs data från portväxeln(incomingbyte) (fall "1": // om "1" kommer digitalWrite(ledPin , HIGH); // break; case "0": // om "0" kommer digitalWrite(ledPin, LOW); // break; ) ) }
Vi slår på den monterade kretsen med Arduino och en bluetooth-modul ansluten till den. En korrekt ansluten modul går omedelbart in i anslutningsberedskapsläget, vilket indikeras av en rytmiskt blinkande status-LED.
4 Parning med bluetooth-enhet
Nu måste du lägga till Bluetooth-enheten i listan över betrodda enheter. Slå på Bluetooth på datorn, gå till Inställningar Bluetooth-enheter.
Om en bluetooth-ikon visas i meddelandefältet när du slår på bluetooth på din dator kan du högerklicka på den och välja:
Vi ser till att vår bluetooth-modul är synlig för datorn. Välj det från listan och tryck på knappen Att knyta. Ange standardlösenordet i dialogrutan 1234 . Om den läggs till kommer enheten att visas i listan med markeringen Parat.
Standardlösenordet för en specifik modul kan skilja sig från "1234". Denna information måste tillhandahållas av tillverkaren (säljaren) av modulen.
Om du vill ansluta till din bluetooth-modul från en smartphone, är proceduren liknande: slå på bluetooth på din smartphone, upptäck modulen som är ansluten till Arduino och koppla ihop med den.
5 Ansluter till bluetooth-modulen via bluetooth från datorn
För att ansluta till bluetooth-modulen kan du använda olika program som kan ansluta till COM-porten. Till exempel som HyperTerminal, PuTTY, Tera Term, Termite och andra. De är alla gratis och fritt distribuerade på Internet.
Bekvämlighet med programmet TeraTermär att den automatiskt visar en lista över COM-portar som är tilldelade till din dators bluetooth-modul. Vi startar programmet, väljer seriell anslutning, väljer motsvarande bluetooth COM-port från listan och klickar på OK.
Program Spackel vid start ber den också om portnumret (COM4, du kommer att ha din egen), anslutningshastighet (9600), anslutningstyp (Serial). Tryck sedan på knappen Ansluta.
Om det uppstår ett fel under anslutningen kommer programmet att visa ett motsvarande meddelande. Om anslutningen mellan din dator och Bluetooth-modulen lyckas kommer du att se ett terminalfält framför dig. Ange siffran 1 i det här fältet från tangentbordet och lysdioden på stift 13 på Arduino tänds; ange 0 och den slocknar.
6 Ansluter från en smartphone via Bluetooth-terminalen
På samma sätt kan du ansluta till bluetooth-modulen från din smartphone. Ladda ner en applikation för att arbeta med bluetooth via terminalen till exempel Bluetooth-terminal. Anslut till modulen och ange kommandona 0 eller 1.
Således lärde vi oss hur man ansluter via bluetooth till Arduino och överför data till den.
Den här artikeln kommer att ha en "slutlig" karaktär, det vill säga den kommer att sammanfatta mina prestationer i arbetet med Arduino-mikrokontrollern, som är så låga. Så att du senare, vid behov, kan återvända till den här plattformen och implementera på- och avstängning av alla enheter på den.
Som jag ser det kan du med hjälp av en Bluetooth-modul styra enheter för ett smart hem eller till och med göra den vanliga öppningen och stängningen av portar på gården eller garaget. Det vill säga, han körde upp och öppnade den. Om du går är det stängt. I princip har jag ännu inte ett privat hus eller en grind, men jag vet redan hur man använder dem :)
Så nu ska jag berätta om detta också.
Principen att slå på och stänga av lasten via Bluetooth med Arduino
Egentligen är principen väldigt enkel. Du måste ha en enhet med möjlighet att installera kontrollprogramvara under Android-systemet. Låt oss säga en telefon eller surfplatta. Därefter tar vi Arduino, såväl som Bluetooth-enheten, kopplar ihop allt och laddar upp programmet till Arduino. Det är allt.
Kopplingsschema för Arduino med Bluetooth-modul
Naturligtvis, i vårt fall kommer det första steget att vara den fysiska anslutningen, och sedan programvaran. Så låt oss börja med anslutningen. Om du har en Arduino UNO och en Bluetooth-modul HC-06 eller 05, måste du ansluta enligt följande. Diagrammet visar dock inte på något sätt kopplingen för styrkretsarna. Det vill säga anslutningen direkt mellan Bluetooth HC-06-modulen och Arduino visas.
Naturligtvis, om du har kontrollutgångar 11 och 13, som i vårt fall, se artikeln nedan, kommer kraftenheten eller bara en lysdiod att anslutas till dem. Det viktiga är att när du ansluter en modul går RX på en enhet till TX på en annan och vice versa. Ta hänsyn till detta!
Skissa för Arduino så att den fungerar med Bluetooth-modulen
Låt oss nu uttrycka det så här om skissen, det vill säga om programvaran som får vår hårdvaruplattform att fungera. Allt är väldigt enkelt. Låt oss se.
Int val; int LED = 13; int LED1 = 11; void setup() ( Serial.begin(9600); pinMode(LED, OUTPUT); digitalWrite(LED, HIGH); ) void loop() (if (Serial.available()) ( val = Serial.read(); / / Vid symbolen “1”, slå på LED 13 if (val == “1”) ( digitalWrite(LED, HIGH); ) // Vid symbolen “0”, stäng av LED 13 om (val == “0” ) ( digitalWrite(LED , LOW); ) // Vid symbolen "2" stäng av LED 11 if (val == "2") ( digitalWrite(LED1, HIGH); ) // Vid symbolen "0" släck LED 11 if (val == "3 ") ( digitalWrite(LED1, LÅG); ) ) )
Faktiskt, här är tilldelningen av variabler, två lysdioder för det 11: e och 13:e benet i vårt fall. Sedan med hjälp av Serial.begin(9600) ansluter vi vår bluetooth. Nåväl, allt som återstår är att hitta ett program för att styra Bluetooth.
Program för surfplatta eller telefon (Android) för att styra belastningen via Bluetooth
Du kan själv hitta något av programmen som stöder styrning av Bluetooth-modulen från din telefon, det är upp till dig. Jag hittade och gjorde i ordning (ladda ner ArduinoRC) installationsprogrammet för mig själv. Det är vad jag satte på min telefon.
Med hjälp av detta program kommer det faktiskt att vara möjligt att ställa in kriterier-villkor för skissen, vilket innebär att man tar emot en signal på utgångsstiften 11 och 13. I vårt fall används knapparna 0,1,2,3. Det är de som tänder och släcker lysdioderna. Se skissen.
Första gången du ansluter enheten kan den kräva ett lösenord, till exempel 000 eller 1234.
Problem med att ladda upp program till Arduino
Det sista jag ville prata om och vad jag stötte på, det vill säga vilket problem som uppstod. Så det här är att när du laddade upp programmet var det nödvändigt att inaktivera bluetooth-modulen. För annars uppstod ett fel när modulen var ansluten och när programmet laddades. Skissen laddades helt enkelt inte upp.
Genom att sammanfatta allt ovan kan vi dra slutsatsen att med Arduino och Bluetooth-modulen för det kan du styra belastningar på flera kilowatt med ett fingerklick på din telefon eller surfplatta.
Nu är samma sak i videon...
Bluetooth i Arduino låter dig ansluta olika enheter trådlöst. Du kan överföra meddelanden från Arduino-sensorer och kontroller till Android-enheter och vice versa, ta emot kommandon från smartphones via bluetooth. I den här artikeln kommer vi att lära oss hur du organiserar trådlös drift av ditt Arduino-projekt med de populära och inte särskilt billiga bluetooth-modulerna HC05 och HC06. Du kommer inte att tro det, men att ansluta och programmera Bluetooth-moduler är inte alls en svår uppgift och är tillgänglig även för nybörjare. Låt oss se till detta.
Ofta kräver projekt fjärrkontroll eller dataöverföring från en telefon eller annan enhet. En av de mest populära och bekväma metoderna är datautbyte via Bluetooth. UART (Serial)-gränssnittet används för att kommunicera mellan Arduino-kortet och datorn. Eftersom alla Arduino-kort har minst 1 UART seriell port, krävs inga specialiserade bibliotek och kretsar för att ansluta en Bluetooth-modul.
De mest populära modulerna är enheter baserade på BC417-chipet. Denna serie kallas HC. Modulerna HC-03 och HC-05 kan vara både en anslutningsserver och en klient, de har ett brett utbud av AT-kommandon.
För att ansluta till en PC behöver du en Bluetooth-modul, Arduino-kort, anslutningskablar och en dator. Skissen för att styra Arduino-kortet via en smartphone och en dator kommer att vara densamma, eftersom data i båda fallen kommer att skickas till mikrokontrollern via UART-protokollet. Diagrammet för anslutning av Bluetooth-modulen till kortet visas i figuren. RX-stiftet på Arduino är anslutet till TDX, TX till RDX, GND till GND, 5V till VCC.
När du laddar upp skissen måste du inaktivera Bluetooth-modulen, annars visas ett fel när du kommer åt Arduino. Du behöver också installera en applikation på en smartphone eller surfplatta som stöder Android OS för att skicka data till modulen. Efter installation av applikationen måste du ladda ner skissen och ansluta modulen till Arduino-kortet. Exempel på LED-blixtkod:
Int val; void setup() ( Serial.begin(9600); pinMode(13, OUTPUT); // Pin 13 är en lysdiod, deklarerad som en utgång ) void loop() (if (Serial.available()) // kontrollerar skickade kommandon ( val = Serial.read(); if (val == "1") (digitalWrite(13, HIGH);) // vid 1 tänds lysdioden om (val == "0") (digitalWrite(13, LÅG) );) / / vid 0 släcks lysdioden ) )
Nu måste du konfigurera anslutningen mellan telefonen och modulen. För att upprätta en anslutning måste du gå till dina telefoninställningar och aktivera Bluetooth. När enheten har hittats måste du ange ett lösenord - vanligtvis "1234" eller "0000". Efter detta måste du gå till applikationen, klicka på knappen "anslut Bluetooth" och välj önskad enhet. Om ihopparningen lyckas kommer LED-lampan på modulen att börja blinka långsammare, ungefär en gång varannan sekund.
I skissen tänds och släcks lysdioden när siffrorna "1" och "0" tas emot. Förutom siffror kan du även använda bokstäver i det latinska alfabetet, som är skiftlägeskänsliga.
På samma sätt kan du ansluta till modulen med hjälp av en dator. För att göra detta finns det olika program som ansluter till COM-porten. När programmet startar frågar det efter portnummer, hastighet och anslutningstyp. Om anslutningen lyckas visas ett terminalfält på skärmen, där du måste ange siffror/bokstäver från tangentbordet som tänder lysdioden.
Beskrivning av Bluetooth HC 06-modulen
Alla befintliga typer av Bluetooth-moduler har sina egna egenskaper, men de är lika i funktion och funktion. En typ av modul är Bluetooth HC 06. Från Arduino-sidan ser modulen ut som ett vanligt seriellt gränssnitt, så att du direkt kan etablera interaktion med enheten på din dator.
Huvudegenskaper hos modulen:
- Strömförsörjning 3,3V – 6V;
- Maximal inspänning 5 V;
- Maximal ström 45 mA;
- Dataöverföringshastighet 1200–1382400 baud;
- Driftsfrekvenser 2,40 GHz – 2,48 GHz;
- Stöder bluetooth-specifikationen version 2.1;
- Låg energiförbrukning;
- Hög nivå av dataskydd;
- Kommunikationsräckvidd 30 m;
- För att ansluta till en smartphone används följande data - lösenord "1234", dataöverföringshastighet 9600, modulnamn HC-06.
Modulen har följande kontakter:
- VCC, GND – strömförsörjning plus och minus;
- RX och TX – mottagare och sändare;
- MCU-INT – visar status;
- Rensa (Återställ) – återställ och starta om modulen. De två sista stiften används vanligtvis inte i drift, så moduler utan dessa stift produceras nu.
HC-06-modulen används endast i slavläge, det vill säga den kan inte anslutas oberoende till andra Bluetooth-enheter. Alla inställningar för anslutningen "lösenord, dataöverföringshastighet" kan ändras med AT-kommandon.
Modulpaketet inkluderar inte anslutningskablar.
Jämförelse av Bluetooth-moduler HC 05 och HC 06
Modulerna HC 05 och HC 06 är de mest använda och kan hittas på rea oftare än andra. Funktionsprincipen för dessa moduler är likartad, båda modulerna är baserade på samma chip, men det finns också viktiga skillnader. För det första kan HC 05-modulen arbeta i två driftlägen - både som master och som slav.
Båda modulerna är två lödda kort. En av dem är fabriksinstallerad med en mikrokrets, den andra behövs för hemmagjorda enheter; den är utrustad med GPIO-stift med en standarddelning på 2,54 mm och en spänningsstabilisator.
HC-05-modulen är något dyrare, men den har fler användbara funktioner.
HC-05 modul pinout:
- SV – energihantering;
- Power VCC;
- RX, TX;
- STATE – indikation;
- KEY – aktiverar kontrollläge med hjälp av AT-kommandon. När KEY=0 – dataöverföring, när KEY=1 – AT-kommandon.
Standardöverföringshastigheten för AT-kommandon för HC-05 är 38400, för HC-06 – 9600. En viktig punkt är att i slutet av AT-kommandon för HC-05 måste det finnas CRLF-tecken.
Huvudegenskaper hos HC-05:
- Driftsfrekvenser 2,4 – 2,48 GHz;
- Överföringseffekt 0,25 – 2,5 mW;
- Räckvidd 10 m;
- Maximal dataväxlingshastighet 115200 baud;
- Strömförsörjning 3,3V;
- Ström 30-40 mA;
- Driftstemperaturer från -25C till 75C.
Anslutningen av båda modulerna till Arduino-kortet är densamma.
Ett alternativ för att ansluta en modul med en avdelare Ett alternativ presenteras för Arduino Nano, men det kommer också att fungera med Uno-kortet.
Slutsats
I den här artikeln tittade vi på alternativ för att ansluta och arbeta med några av de vanligaste Arduino-modulerna Bluetooth HC05, HC06. Du bör inte ha några särskilda svårigheter med dessa moduler - anslut den bara till stift med hårdvara eller mjukvara UART och använd sedan traditionella bibliotek (Serial för modulen som är ansluten till stift 0, 1, SoftwareSerial om du ansluter till andra).
Att ansluta Bluetooth till ditt Arduino-projekt kan avsevärt öka din förmåga att kommunicera med andra enheter. Du kommer att kunna övervaka sensorernas tillstånd och ändra systemparametrar utan att starta om styrenheten. Och självklart kan du enkelt skapa robotar och bilar med Arduino, styrd via bluetooth från en smartphone. Förhoppningsvis kan du göra ditt första projekt efter att ha läst den här artikeln.
Den här artikeln ger steg-för-steg-instruktioner som hjälper dig att skapa din egen applikation för en Android-smarttelefon som är utformad för att styra något via Bluetooth. För att demonstrera kommer vi att analysera i detalj ett exempel på att blinka en LED på Arduino med hjälp av kommandon från en telefon eller surfplatta. Som ett resultat av att följa våra instruktioner kommer du att lära dig att göra detta:
För att styra en hemrobot behöver du bara lägga till knappar och bearbeta deras kommandon på Arduino-sidan.
Vad kommer det att krävas?
- Alla Arduino-kompatibla kort
- Bluetooth-modul
- Enhet som Android OS är installerat på
Det är bäst att använda HC-05 som en Bluetooth-modul. Det är lätt att köpa i en kinesisk webbutik eller på eBay. Modulen drivs av 3,3V, men dess I/O-linjer kan hantera 5V logik, vilket gör att dess UART kan anslutas till en Arduino.
Bluetooth-modul HC-05
Ansluter en Bluetooth-modul till Arduino
Så nu måste vi ansluta vår Arduino med Bluetooth. Om Arduino inte har en 3,3V-utgång, utan bara 5V, måste du installera en stabilisator för att minska effekten. Tilldelningen av HC-05-stiften är lätt att hitta på Internet. För användning rekommenderar vi att du gör en tavla med kraftledningar, Rx och Tx. Anslutning till Arduino måste göras i följande ordning:
- Arduino-utgång 3,3V eller (5V genom en stabilisator!) - till stift 12 på Bluetooth-modulen
- Arduino GND-utgång - till stift 13 på Bluetooth-modulen
- Arduino TX-utgång - till stift 2 på RX Bluetooth-modulen
- Arduino RX-utgång - till stift 1 på TX Bluetooth-modulen
Efter anslutning måste du kontrollera Bluetooth-modulens funktionalitet. Anslut lysdioden till stift 12 på Arduino och ladda upp följande skiss till kortet:
Char incomingByte; // inkommande data int LED = 12; // LED är ansluten till stift 12 void setup() ( Serial.begin(9600); // initierar porten pinMode(LED, OUTPUT); // Ställ in stift 12 som utgång Serial.println("Tryck 1 för att LED ON eller 0 till LED OFF..."); ) void loop() ( if (Serial.available() > 0) ( //if data arrived incomingByte = Serial.read(); // läs byten if(incomingByte == "0" ) ( digitalWrite(LED, LÅG); // om 1, stäng sedan av lysdioden Serial.println("LED AV. Tryck på 1 för att lysa på!"); // och skriv ut meddelandet ) if(incomingByte == "1") ( digitalWrite(LED, HÖG); // om 0, slå sedan på LED Serial.println("LED PÅ. Tryck 0 för att LED AV!"); ) ) )