Arduino Bluetooth

Fra Kommunikation-IT Holstebro HTX
Skift til: navigering, søgning
Blue-Tooth modul

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

Blue-Tooth diagram til PIC-board

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'".
Bt settings.png

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