slom писал(а):насчет проверки работоспособности так это первым же делом сделал:
Ну, круто. Значит идем дальше.
slom писал(а):главный вопрос, как перенести выполнение этих функций на другую дуню...
тоесть сейчас оно работает на 1й ардуине. а надо чтобы с 1й шли команды на 2ю и там уже крутились сервы и моторы...
Теперь идем изучать протокол управления "TREX_controller". Открываем текстовым редактором скетч "Bluetooth.ino", достаем бубен и кальян
- Код: Выделить всё
void Bluetooth()
{
//============================================================= Bluetooth Control ===================================================
static byte d,e; // data and error bytes
if(Serial.available()>2) // Command is 3 bytes in length
{
d=Serial.read(); // read byte from buffer
if(d!=startbyte) // if byte is not a start byte (0x0F)
{
lmspeed=0; // bad data received
rmspeed=0; // set motor speeds to 0
e=0; // error flag reset
}
else
{
lmspeed=(int(Serial.read())-127)*2-1; // good data received
rmspeed=(int(Serial.read())-127)*2-1; // read values for left and right motors
}
}
else // less than 3 bytes in buffer
{
e++; // count program loops with less than 3 bytes in buffer
if(e>100) // assume lost signal if buffer less than 3 bytes for too long
{
lmspeed=0; // stop left motor
rmspeed=0; // stop right motor
e=0; // reset error counter
}
}
Motors(); // update motors
}
И шо мы тут видим? А видим мы: если принято >2-х байт и первый байт 0x0F (старт байт), то след. 2 байта - это "lmspeed=(int(Serial.read())-127)*2-1; " и "rmspeed=(int(Serial.read())-127)*2-1;". Т.е. протокол: 1-й байт всегда 0x0f, 2-й байт - мощность левого мотора, 3-й байт - мощность правого мотора. Все! Бинго!
Теперь проверяем. Вешаем сообщение 0x0f,0x20,0x20 (старт байт, 0х20 на левый и правый мотор) на какую-нибудь кнопку, например на "L3". Ищем "L3 pressed" (ctrl f) в скетче "PS2X_Example_RUS.ino". Находим всего одно упоминание:
- Код: Выделить всё
if (ps2x.NewButtonState()) { //будет TRUE если какая то кнопка изменила свой статус (Вкл. на Выкл. или Выкл. на Вкл.)
if(ps2x.Button(PSB_L3))
Serial.println("L3 pressed"); // L3 нажата
if(ps2x.Button(PSB_R3))
Serial.println("R3 pressed"); // R3 нажата
if(ps2x.Button(PSB_L2))
Serial.println("L2 pressed"); // L2 нажата
if(ps2x.Button(PSB_R2))
Serial.println("R2 pressed"); // R2 нажата
if(ps2x.Button(PSB_TRIANGLE))
Serial.println("Triangle pressed"); // Треугольник нажат
}
В яндексе находим "Serial.println"
http://arduino.ru/Reference/Serial/Printlnи 2-ю (без ln)
http://arduino.ru/Reference/Serial/Printи посылку байтов:
http://arduino.ru/Reference/Serial/WriteЗапускаем калькулятор в инженерном режиме (для перевода hex в десятичный вид). Делаем глубокий вдох через кальян
И переводим 0x0f,0x20,0x20 в десятичный вид. Т.е. на калькуляторе жамкаем кнопку "hex", вбиваем "f", жамкаем кнопку "dec", получаем "15". Наше сообщение из: 0x0f,0x20,0x20 стало: 15,32,32. Теперь эти данные вбиваем в Serial.write:
- Код: Выделить всё
Serial.write(15);
Serial.write(32);
Serial.write(32);
А еще лучче так (но это потом)
- Код: Выделить всё
char MyBytes[3] = {15, 32, 32}; //массив из 3 байт со значениями 15,32,32
Serial.write(MyBytes); //выводит 3 символа с кодами 15,32,32
Т.к. в исходнике данные отправлялись одной функцией, а у нас получается куча строк, то эту кучу надо оформить гребаными фигурными скобочками. Т.е. получается так:
- Код: Выделить всё
if (ps2x.NewButtonState()) { //будет TRUE если какая то кнопка изменила свой статус (Вкл. на Выкл. или Выкл. на Вкл.)
if(ps2x.Button(PSB_L3))
{ // L3 нажата
Serial.write(15);
Serial.write(32);
Serial.write(32);
}
if(ps2x.Button(PSB_R3))
Serial.println("R3 pressed"); // R3 нажата
if(ps2x.Button(PSB_L2))
Serial.println("L2 pressed"); // L2 нажата
if(ps2x.Button(PSB_R2))
Serial.println("R2 pressed"); // R2 нажата
if(ps2x.Button(PSB_TRIANGLE))
Serial.println("Triangle pressed"); // Треугольник нажат
}
Компилим, заливаем, смотрим в терминалке, там будет хрень, т.к. данные стали не ASCII символы
На будущее ищем хорошую терминалку, которая умеет отображать не только ASCII символу, но и любые байты. В линухе это moserial.
Шо мы получили? Мы отредактировали одну строку под наши нужды
Если теперь на 2-й дуине выкинуть блютуску, а tx первой дуины соединить с rx 2-й. То 2-я дуина начнет получать команды не через блютуску, а через 1-ю дуину в формате блютуски. Не забываем соединить земли обоих дуин. Осталось в первой дуине настроить скорость порта = скорости 2-й дуины. В PS2X_Example_RUS.ino заменить: "Serial.begin(57600);" на нужное значение, скорее всего на 9600. Жмем на джойстике кнопку влево и машинка резво (или нет) едет назад
Ой, чо-то сложно обьяснил