Экосистема Arduino позволяет загружать скетчи не только проводным способом через USB, но и беспроводным, например, с помощью Bluetooth. Благодаря такому способу прошивки программировать Arduino можно на некотором расстоянии от компьютера, что, несомненно, удобно при отладке какого-нибудь стационарного объекта с Arduino, который проблематично поднести и подключить к компьютеру через USB.

Для загрузки прошивки по Bluetooth можно использовать классический модуль HC-06. В данном материале будет показан пример программирования Arduino по Bluetooth через HC-06.
У модуля Bluetooth HC-06 есть линия сигнала STATUS. Этот сигнал указывает, когда установлено соединение Bluetooth. Также нам нужно управлять сбросом (Reset) Arduino до и после прошивки. Поэтому помимо HC-06 нам может понадобиться какой-нибудь простейший микроконтроллер для несложного управления процессом прошивки. Для этих целей может подойти, например, ATTINY85. Ниже показана схема подключения платы TRINKET на основе этого МК к HC-06 и Arduino.

Поскольку логика управляющей части имеет напряжение 3.3 В, а не 5 В, то был задействован делитель напряжения на линии Tx. При использовании платы Arduino с логикой 3.3 В подключение упрощается, как показано ниже.

Плата TRIKET проверяет уровень сигнала STATE для определения наличия или отсутствия подключения по Bluetooth и генерирует импульс RESET.

Ниже приведен скетч (код) для платы TRIKET, позволяющей управлять процессом загрузки прошивки для Arduino по Bluetooth.
#define LEDPIN 1 // вывод светодиода для индикации
#define RESETPIN 0 // на линию RESET платы Arduino.
#define STATPIN 2 // на линию STATUS модуля HC-06
volatile bool flag= false;
int pulseTimer= 120; // время ожидания импульсов STATPIN
/*------------------------------------------------------------------------------
setup() - настройка
------------------------------------------------------------------------------*/
void setup(){
GIMSK = 0b00100000; // настраиваем прерывания по изменению состояния сигналов на линиях
// PCMSK = 0b00010011; // прерывания на линиях PB0, PB1, & PB4
PCMSK = 0b00000100; // прерывание на линии 2 (PB2)
sei(); // разрешаем прерывания
pinMode(LEDPIN, OUTPUT);
pinMode(RESETPIN, OUTPUT);
pinMode(STATPIN, INPUT_PULLUP);
digitalWrite(RESETPIN, HIGH); // RESET в высокий логический уровень
}
/*------------------------------------------------------------------------------
loop() - бесконечный цикл
------------------------------------------------------------------------------*/
void loop(){
delay(1);
if(flag){
pulseTimer=120; // заново настраиваем время ожидания импульсов STATPIN.
flag = false;
}
else pulseTimer--;
if(pulseTimer == 0){
// здесь мы можем проверить «0» в последовательном канале (57600 бод)
digitalWrite(RESETPIN, LOW); // отправляем импульс на линию RESET в течение 1 мс.
delay(1);
digitalWrite(RESETPIN, HIGH); // снова в высокий логический уровень
while(!flag){
digitalWrite(LEDPIN,LOW);
delay(500);
digitalWrite(LEDPIN,HIGH);
delay(500);
}
}
}
/*------------------------------------------------------------------------------
Pin Change Interrupt of pin 2 (PB2).
------------------------------------------------------------------------------*/
ISR(PCINT0_vect){
flag = true; // сигнализирует об изменении вывода 2
digitalWrite(LEDPIN,digitalRead(STATPIN)); // сигнализирует о статусе STATUS модуля HC-06
sei(); // разрешаем прерывания
}
© digitrode.ru