При конструировании мобильных платформ (в моём случае игрушек на Ардуино) как то задумался о дистанционном варианте взаимодействия с платами.Готовых доступных вариантов почему-то не нашёл. Захотелось придумать вариант платы-расширения под про мини или нано. На данный момент задача не решена полностью, но выделены три подзадачи: дистанционное включение-выключение платы, дистанционная загрузка скетчей из IDE, дистанционное управление работой загруженного варианта.
В данной теме предлагаю делиться соображениями по оптимальному решению. Сам пока вразумительно научился заливать скетчи по воздуху, этим умением и поделюсь...
Сначала ознакомился с несколькими вариантами решений из "интернетов"
https://www.drive2.ru/c/2749401/https://www.pvsm.ru/arduino/69006http://robocraft.ru/blog/3089.htmlhttps://yandex.ru/video/preview?text=загрузка%20скетчей%20по%20блютуз&path=wizard&parent-reqid=1603514788456649-147199760590468659800107-production-app-host-man-web-yp-353&wiz_type=v4thumbs&filmId=4660038959776800802
Все они используют модуль HC-05 и требуют его перенастройки с использованием АТ команд. Поэтому вначале, следуя рекомендациям
https://kolotushkin.com/article.php?id=30научился менять скорость обмена данными...
Добавлено спустя 1 час 33 минуты 24 секунды:Далее действовал по алгоритму:
1. Добавил строчку в файл Arduino IDE чтоб HC-05 не сбрасывал соединение при перезагрузке
2. Загрузил проводным способом тест-скетч блинка
3. Собрал схему
4. Подключил модуль связи на ПК
5. Настроил порт, плату и монитор для связи
6. Стал передавать данные- паузы между вспышками светодиода
7. Залил по воздуху этот же скетч в плату
8. Послал "0"- перезагрузил плату
далее повторял пункты 6-8 несколько раз.
Код:
//тест "блинк" для дистанционной загрузки скетчей в плату ардуино уно
long Y=0;//пременная хранения моментов времени
int t=1000;// переменная хранения длительностей пауз между переключениями светодиода
void setup()
{
Serial.begin(115200); // скорость 115200 для Arduino UNO,
// может быть разная для разных моделей плат
////////////
pinMode(13,OUTPUT);
digitalWrite(13,LOW);
}
void loop()
{
if(millis()-Y>t){Y=millis();digitalWrite(13,!digitalRead(13));}//мигаем светодиодом как угодно с паузой
t=CheckSerial();//по поступившей команде выставляем паузу
}
основной и добавочный ino. в папку основного
Код:
//
int uploadpin=7;// вывод платы для осуществления аппаратной перезагрузки, соединён с RES
String inputString;// строки данных
int n=1000;//переменная хранения команды-числа
/////////////////////////////////////////////////////////////////////////////////////////////////
//ФУНКЦИИ ПРИЁМА И ОБРАБОТКИ КОМАНД-ДАННЫХ
int CheckSerial()
{
//////////////////////////////////////////////////////////////////////////////
while (Serial.available())//считываем строку данных пока они поступают
{
char inChar = (char)Serial.read();
if (inChar == '\n'||inChar == ' ') //если окончание строки или запрос на загрузку
{
MakeCmd();//обрабатываем её данной функцией
break;
}
else inputString += inChar;// иначе удлиняем строку на один символ
}
return n;// возвращаем значение переменной как значение всей функции
}
/////////////////////////////////////////////////////////////////////////////////
void MakeCmd()
{
int y = inputString.length(); // присваиваем переменной у число символов в строке
if (y < 1 || y > 4){inputString = "";return;} //если их меньше 1 или больше 4, выходим из функции
String cmd = inputString; // передаём строку другой переменной
inputString = "";//"обнуляем переменную"
//////
if (cmd == "0") { //если получили ноль
Serial.write(0x14); // ответить avrdude.exe
Serial.write(0x10); // для синхронизации
delay(10);
pinMode(uploadpin,OUTPUT); //ЭТО ВЫЗОВЕТ аппаратный РЕСЕТ
}
if (cmd != "0"){ n=cmd.toInt();} // преобразуем строку в номер команды-число
//////
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
Добавлено спустя 3 минуты 7 секунд:Для связи с пк использую модуль такой: Bluetooth 4.0 адаптер DEXP AT-BT401