Arduino Bluetooth
På trods af overskriften, så dækker denne side både over Arduino og PIC, fordi meget af det er fælles for begge mikrocontrollere.
Generelt er Blue-tooth en kommunikations-standard, hvor man kan tilslutte mindre moduler til hinanden og kommunikere data.
Normalt anvendes Blue-tooth til ting som fil-overførsel eller lydtransmission, men kan også anvendes til at lave en seriel port på en PC, der kobles op som en COM-port på PC'en og som en UART-port på PIC/Arduino.
Opkobling
For at koble modulet til Arduinoen skal der leveres 5 volt til VCC benet, GND til GND, RX til TX og TX til RX.
Blue-Tooth | Arduino | PIC16F690 | PIC16F628 | PIC16F877 |
---|---|---|---|---|
VCC | +5V | Port B ben 9 | Port B ben 9 | Port C ben 9 |
GND | GND | Port B ben 10 | Port B ben 10 | Port C ben 10 |
TX_D | Digital 0 | Port B ben 6 | Port B ben 2 | Port C ben 8 |
RX_D | Digital 1 | Port B ben 8 | Port B ben 3 | Port C ben 7 |
Diagram til opkobling
Til at forbinde Blue-tooth modulet med Arduinoen eller en PIC kan man selvfølgelig anvende jumper-wires, men man kan og lave et lille print, som det er illustreret her (det er kun diagrammet der er vist).
Man kan hente en Eagle-version af diagram og board i denne ZIP-fil.
Opsætning
Arduino bluetooth modulet vil komme frem med navnet HC-06 når der søges efter det. For at paire med modulet skal koden 1234 bruges. Efter at have pairet med modulet vil kan man bruge det som en normal serial port fra computeren. For at finde ud af hvilken COM port den bruger, kan man åbne "Bluetooth Settings" under "Kontrolpanel", åbne "COM Ports" tabben, og så finde den COM port der er "Outgoing" med navnet "HC-06 'Dev B'".
Kommunikation
Når man har styr på hvilken port der bruges kan man kommunikere med følgende indstillinger.
Baudrate: 9600 Parity: None Data Bits: 8 Stop Bits: 1
Der skal opsættes software både i PC'en og i PIC/Arduino for at kommunikationen kan fungere.
I PC'en kan man anvende et færdigt terminal-program, specielt til test, men det kan tit være fornuftigt at skrive sit eget program, specielt hvis det bare er rå tal man sender/modtager.
Da det er Blue-tooth standarden der anvendes, hvor der er sket en parring, så det er ikke nødvendigt at addressere det man sender / modtager, der er direkte hul igennem kanalen. Det er heller ikke nødvendigt at lave nogen form for fejl-tjek, da det er indbygget i Blue-tooth standarden. Man kan altså nøjes med at sende / modtage de rå data.
C# Eksempel til at sende fra PC
var port = new SerialPort("COM10", 9600, Parity.None, 8, StopBits.One);
port.Open();
var packet = new List<Byte>();
packet.Add(0x01);
port.Write(packet.ToArray(), 0, packet.Count);
port.Close();
C# Eksempel til at modtage på PC
var port = new SerialPort("COM10", 9600, Parity.None, 8, StopBits.One);
port.Open();
while (port.BytesToRead > 0)
{
byte data = port.ReadByte();
switch (data)
{
case 0x01: /* Udfør command 1 */ break;
case 0x02: /* Udfør command 2 */ break;
case 0x03: /* Udfør command 3 */ break;
default: /* Ved ikke kendt command */ break;
}
}
port.Close();
Arduino eksempel til modtagelse
I dette kodeeksempel kan f.x. en PC sende kommandoer til en Arduino, der så kan gøre forskellige ting, alt efter hvilken kommando der sendes.
Kodeeksemplet kan hentes i denne ZIP-fil
byte command = 0;
void setup() {
// initialize serial:
Serial.begin(9600);
}
void loop() {
// if there's any serial available, read it:
if (Serial.available() > 0) {
command = Serial.read();
switch (command) {
case 1:
; // Udfør command 1
break;
case 2:
; // Udfør command 2
break;
case 3:
; // Udfør command 3
break;
default:
; // ved ikke kendt command
}
}
// Andre ting i loopet
}
Arduino eksempel til sending
I dette kodeeksempel kan f.x. en PC modtage analoge værdier fra en Arduino. Værdierne sendes som ASCII karaterer på en linje og kan derfor være alle værdier værdi mellem 0 og 1023 som AD-konverteren kan give. Hvordan PC'en opfanger værdierne og lagrer dem er op til PC-programmøren.
Kodeeksemplet kan hentes i denne ZIP-fil
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// print out the value you read:
Serial.println(sensorValue);
delay(10); // delay in between reads for stability
}
PIC eksempel til modtagelse
I dette kodeeksempel kan f.x. en PC sende kommandoer til en PIC, der så kan gøre forskellige ting, alt efter hvilken kommando der sendes.
Kodeeksemplet kan hentes i denne ZIP-fil
-- set all IO as digital
enable_digital_io()
-- setup serial
const serial_hw_baudrate = 9600
include serial_hardware
serial_hw_init()
var byte command
forever loop
if serial_hw_read(command) then
case command of
1 : block
-- kode til kommando 1
end block
2 : block
-- kode til kommando 2
end block
3 : block
-- kode til kommando 3
end block
otherwise -- ignore command
end case
end if
-- Resten af koden i main-loop
end loop
PIC eksempel til sending
I dette kodeeksempel kan f.x. en PC modtage analoge værdier fra en PIC. Værdierne sendes som en Byte og kan derfor være en værdi mellem 0 og 255. Hvordan PC'en opfanger værdierne og lagrer dem er op til PC-programmøren.
Kodeeksemplet kan hentes i denne ZIP-fil
-- set all IO as digital
enable_digital_io()
const byte ADC_NVREF = 0
include adc_holst
-- setup serial
const serial_hw_baudrate = 9600
include serial_hardware
serial_hw_init()
var word val
forever loop
val = adc_read(2) -- læs en analog værdi
val = val / 4 -- tilpas til Byte
serial_hw_write(byte(val)) -- send resultat
-- Resten af koden i main-loop
delay_1ms(10)
end loop