Работа с беспроводным модулем APC220-43
- Войдите на сайт для отправки комментариев
Вс, 31/03/2013 - 16:49
Хочу попробовать дистанционно управлять двигателем с помощью модулей АРС220-43.
Имеются три параметра, которые снимаю с потенциометров.
int value1; int value2; int value3; value1 = analogRead(A1); value2 = analogRead(A2); value3 = analogRead(A3);
Есть несколько кнопок, при нажатии на которые на приёмник передаются соответствующие им комбинации значений value1, value2 и value3. Как я понимаю, эти значения нужно записать в массивы для каждой кнопки. Подскажите, как правильно записать три параметра в массив для передачи через Serial а потом его прочитать. С передачей одного параметра разобрался, а вот с массивами столкнулся впервые.
P.S. непонятно причем тут безпроводный модуль? Ну то есть понятно что он есть в проекте, но вот к вопросу он явно отношения не имеет. Даже если все через него идет. Спросили-бы "как массив в Serial отправить". А тогда возможно и поиском бы что-то нашли ;)
Спасибо, будем пробовать.
Трудно разобраться. Так будет более понятно
Потом читаю.
>Трудно разобраться. Так будет более понятно
Ну, во первых, вы просили "покажите как массив" - я показал "как массив".
Хотя, можно конечно, и по одному байту слать.
А так как вы показали, может и более понятно, да только работать не будет. Как минимум из-за использования print
Если хотите деталей (почему не print), то вот тут расписывал http://arduino.ru/forum/processing/serial-read#comment-25842
Там речь идет про arduino->processing, а у вас arduino->arduino, но суть проблемы будет та же самая.
Вообщем - вместо print используйте write.
А вообще, судя по вашему коду - есть подозрение что вы изначально задачу неправильно сформулировали и хотите что-то совсем другое (но что?). Попробуйте еще раз объяснить что именно вы хотите.
Или что именно "трудно разобратся".
Мне просто трудно понять, что же там трудного :) Строка 16-ть - пример как отсылается массив, строка 23 - как прочитать массив из сериал.
Чем и как вы заполните массив перед отсылкой - ваше дело. Так же как и что будете с ним делать после того как прочтете его из Serial.
Или массив тут вообще не нужен.... вообщем похоже что я просто не понимаю что вам нужно.
Может просто опишите, что за девайс делаете, в двух словах? Тогда легче будет понять что вам требуется.
Переработал схему управления шаговиком.
При подаче питания потенциометр управляет скоростью вращения.
Кнопка1 - на мотор передаются данные для 1 движения (скорость1, ускорение1, перемещение1)
Кнопка2 - на мотор передаются данные для 2 движения (скорость2, ускорение2, перемещение2)
Кнопка3 - на мотор передаются данные для 3 движения (скорость3, ускорение3, перемещение3)
Кнопка4 - опять управляю потенциометром.
Как организовать правильно передачу такого количества данных через Serial я не знаю. По сети лазил, но ничего конкретного не нашёл. Массивы для меня тоже тёмный лес (может они и не нужны).
не если "массивы темный лес", то однозначно читать про них. в этой задаче, возможно, без них и получится обойтись, но... все равно никуда не уедите.
Про
>Кнопка4 - опять управляю потенциометром.
Не понял.
С первыми тремя - более/менее ясно.
Вопрос только в том эти эти "скорость/ускронеие/перемещение" - какого типа? В каком диапазоне они могут лежать? Проще всего гонять char/byte. Если же int, long и т.п. - уже чуток сложней (в понимании, в реализации - не сложней). Если же вы не уверены чем отличаются int от byte - то однозначно идти читать про типы. Без этого - вообще никак.
Предположим что они у нас byte. То есть могут принимать значение от 0 до 255.
Тогда отправка в принципе проста
Для остальных кнопок - аналогично
А читать примерно так:
Примерно так. С хотя с массивами, как на меня, было бы понятей и компактней. Массив из 4-рех элементов. Первый элемент - номер мотора, остальные - ваши данные.
А еще более красиво - было-бы с использованием структур. Но боюсь сразу мозг взрывать :) Хотя, постепенно может и до них дойдем.
Если данные не будет успевать "добегать", то возможно между всеми Serial.read() нужно будет еще натыкать
P.S. Ну и надеюсь что ловить ловить нажатие кнопки, боротьяс с ее дребезгом - вы уже умеете. Если нет - читайте прикрепленную тему про кнопки.
А да.. забыл сказать что за маркер такой. Ну вот придумалось мне, перед данными, всегда посылать две звездочки. Типа как сигнал "счас данный пойдут". Что-бы если был перерыв в передаче, или вторая дуина включилась позже - она всегда могла определить где именно "начало пакет данных".
Вообщем игнорирует все пока не прийдут две ** - и за ними читает ровно четыре байта.
C дребезгом я уже давно подружился.
Данные int (до 1200).
А как тогда с управлением с помощью потенциометра Serial.write(valPot) и valPot = Serial.read(), где эта часть кода должна быть? Управление шаговым двигателем потенциометром и кнопками разное.
Я уже сказал - я про потенциометр - нифига не понял. Поэтому "где это часть кода дожна быть" - сказать вам не могу.
Но общий подход все этой беды лучше делать таким.
Отдельно - читаем входы, заполняем в какие-то переменные (массивы, структуры e.t.c)
Отдельно - по отлову каких-то событий (нажатие кнопки, изменение состояние потенциометра и т.п.) - отправляем подготовленные данные в Serial.
Вообщем не мешать мухи и котлеты.
> Данные int (до 1200).
А бы вам советовал, для начала все-таки огранчинится byte. Что-бы не взрывать мозг вот этим Запись в EEPROM | Аппаратная платформа Arduino (там выясняли как разбирать int на байты).... хотя стоп. Это же ваша тема :) Ну значит уже знаете.
Значит вместо Serial.wirte(speed1); будете делать что-то типа Serial.wirte(speed1HiByte);Serial.wirte(speed1LowByte);
Вообщем, на самом деле, все довольон похоже на то как вы с eeprom работали. И кстати такие же read/write использовать. Только адресов нет.
А можно не разбиратся, слать int тем же способом как и массив в сообщении #1.
Но.. я бы все-таки для начала/простоты предложил потренироватся с байтами (ну потеряете точность, будет немного "скачками" менятся). Зарабоатет - потому будете полировкой заниматся.
Перейти к байтам вам поможет функция map. На отправляющий делаете, перед отправкой, map(value,0,1200,0,255) , а на принимающей обратно востанавливаете диапазон map(readedValue,0,255,0,1200)
Тогда отправка в принципе проста
Для остальных кнопок - аналогично
А читать примерно так:
А как быть если при нажатии разных кнопок передаётся разное количество данных. Например при нажатии кнопки А передаётся 5 байт( два параметра плюс маркер ), а при нажатии кнопки В передаётся 7 байт( четыре параметра плюс маркер). Как организовать чтение данных в таком случае?
Просто, или вы определяетесь с размером пакета, который всегда будет одинаковый или в начале пакета передаете размер пакета.
Подскажите, правильно ли записал чтение пакета
Продолжение в студию!!!)))
Непонятен смысл строк с 4 по 8, а правильно или нет вы читаете зависит от того как вы отправляете пакет. Так же между каждым
Serial
.read()
рекомендую ставить задержку иначе байты не будут успевать приходить и вы будете читать пустой буфер или нужно дождаться необходимого количества байт -if
(
Serial
.available() >= 8)
To Maksim помогите разобраться!!! очень много гуглил и яндоксил но немогу ни как понять, как это работает
по порядку
1) есть две ардуины мега, на одну передатчик заведенны джойстики (переменные резисторы), а на вторую приемник драйверы ДС движков!!!
2) есть вот это т скетч предоставленный vvadimom
как передат по сериал значение с джойстика!!!!! и не сильно переделывать скетч!!
я нуб но очень интересно чтоб это заработало!!
ОГРОМНОЕ СПАСИБО !!!!!!!!