Несколько вопросов. Не могу решить сам.
- Войдите на сайт для отправки комментариев
1. Можно ли прошить арду через bluetooth?
Имеем: Arduino Uno, Wireless Shield, Bluetooth Bee, MacBook Pro. Реально ли прошить ардуину (залить написанную программу) не подключая по проводу? Я пытался, выбирал в Arduino.App порт нужный (tty bluetooth), но заливка идёт с ошибкой в конце. Что делаю не так?
пробовал вставить '/n' внутрь строки внутри sprintf, ничего не вышло.
3. Как можно распилить строку типа "name:key;name2:key2;name4:key4;name98:key1" по названиям функции и значению?
Грубо говря, встретилось значение name, значит key (всё, что до следующего ";" ) кладём в переменную A. Если встретилось name2, то в переменную B. и т.д.
4. Как изменить напряжение аккумулятора, который подключер ко входу питания?
Там аккумулятор на 12в. Надо если садится, то сообщить.
За ответы с меня восхищение, и бутыль пива (или бургер), если вы в мск))
ales2k занимается этим вопросом, мну самого интересует. Ищите в теме "Заливка скетча через Bluetooth".
Может быть, нужно \n. Если никак, то может вывести сначала одну строку, потом перевод строки, потом другую. Если нет, то может быть нельзя использовать выражение "+", тогда надо sprintf(buf ,"T:%dC\nH:%d%%", t, h); или типа того. В этом же месте кстати кавычки у \n одиночные а у основного выражения двойные - возможно тупит из-за этого.
Скорее всего циклом и подстрокой. Поймали "name" в строке - копируем всё что до следующего двоеточия, получаем n - номер name. пропускаем один знак (:), копипуем все что до следующей точки с запятой - получаем содержимое name[n]. Вырезаем из строки всё от начала до того места где находимся, плюс один байт (;). Повторяем пока строка не будет пустой или не перестанет попадаться "name". Сейчас исходник писать вилы, спать охота.
Бьюсь об заклад, что имелось в виду измерить. Имеем вход 12 и 5-вольтовую логику (плата Uno). Значит, собираем делитель на три (20k+10k например), соединяем на АЦП, измеряем цифру на АЦП, измеряем на аккуме тестером. Домножим потом на коэффициент компенсации, который находится делением напряжения измеренного скетчем, на напряжение которое сказал тестер. Или наоборот, напряг на тестере поделить на напряг измеренный. Короче варианта только два :)
Формула - U=5/(1024*D)*ADC, где D - коэффициент деления делителя, примерно равный 1/3, но реально что-нибудь типа 0.9975/3.0073, поэтому сначала грубо подгоняется а потом делается компенсация.
Если будет стоять на автомобиле, на всякий пожарный можно делитель сделать на 4, разрешающая способность особенно от этого не хромает.
строки пиляться отлично функцией
пример тут
В этом же месте кстати кавычки у \n одиночные а у основного выражения двойные - возможно тупит из-за этого.
не, одинарные кавычки как-то по другому реагируют. Хз как объяснить правильно, в общем "\n" в двойных выдаст "\n", а в одинарных станет переводом строки. то есть символ NL
Бьюсь об заклад, что имелось в виду измерить.
Да, именно) За ответ огромное спасибо) буду пытаться))) Использоваться будет не в машине))) а в воздухе))
строки пиляться отлично функцией
пример тут
Мм.. Супер)) спасибки) То, что надо))
не, одинарные кавычки как-то по другому реагируют. Хз как объяснить правильно, в общем "\n" в двойных выдаст "\n", а в одинарных станет переводом строки. то есть символ NL
как бы не совсем так или точнее вовсе не так
компилятор С/С++ воспринимает одинарные кавычки как тип char те один символ, а двойные кавычки как строка заканчивающася нулевым символом. При использовании sprintf должно работать так sprintf(buf, "%d\n%d", i, j).
Честно не знаю как серийном мониторе ардуино, но в IBM PC всегда стандартным было перевод строки делать двумя следующими друг за друном символами "\n\r"
не, одинарные кавычки как-то по другому реагируют. Хз как объяснить правильно, в общем "\n" в двойных выдаст "\n", а в одинарных станет переводом строки. то есть символ NL
как бы не совсем так или точнее вовсе не так
компилятор С/С++ воспринимает одинарные кавычки как тип char те один символ, а двойные кавычки как строка заканчивающася нулевым символом. При использовании sprintf должно работать так sprintf(buf, "%d\n%d", i, j).
Честно не знаю как серийном мониторе ардуино, но в IBM PC всегда стандартным было перевод строки делать двумя следующими друг за друном символами "\n\r"
Действительно, так просто и работает =) Я думал не будет так. Спасибо!
К сожалению с голубым зубом пока подвижек вперед нету.
Далее немного не в эту тему Ж)
Для экспериментов собрал схему с из двух 328p (пока не по радио а проводом) соединенных по ком порту - задача прошить третью.
То есть
Комп <-com-> источник 328p <-com-> приемник 328p <-com-> прошиваемая 328p
Даже такую схему пока наладить не удалось - не понимаю в чем дело...
Везде 57600. Щупал цифровым пробником - сеанс начинается и сразу рвется. Пока думаю про задержки обработки и буферы портов.
а что насчет ресета? заливка осушествляется кодом загрузчика, а загрузчик активируется в момент рестарта
без резстарта номер с загрузкой не пройдет
Вопрос ресета конечно решен. и прошиваемая 328p уходит в ребут и даже начинает принимать первые данные - смотрел анализатором, затем чтото отвечает и облом.
Причем данные туда обратно предаются, то есть заранее загруженный скетч через ком порт управляется нормально.
Я предполагаю что проблема в следующем:
57600 это 1 байт каждые 138 микросекунд и задержка на ожидание ответа от прошиваемой 328р тоже находится гдето в этом порядке, а постановка в промежуток моей машинерии вносит доп задержку и этому мешает.
Нашел сегодня страничку http://www.faludi.com/itp_coursework/meshnetworking/XBee/XBee_program_Arduino_wireless.html
Попробую использовать.