Официальный сайт компании Arduino по адресу arduino.cc
Как DS18B20 через дуню управляет бесколлекторным двигателем через (ESC) КОНТРОЛЛЕР а? помогите пожалуйста
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
всем атас здрассте!
я новичёк, похожего много на просторах инета но, то что нужно, найти не смог, я не с пустыми руками...
есть ds18b20, который слава богу правильно показывает (t), в выбранном мною диапазоне 20-77 (значения в градусах цельсия) через моник порта
есть (ESC) КОНТРОЛЛЕР (для бесколлекторного двигателя) подсоединённый к дуне который крутит мотор в диапазоне значений 63-120, то есть 63 это минимальное значение для контроллера с дуни, и 120 максимальное соответственно. Если значение не в диапазоне то контроллер не реагирует
цель - как сделать зависимость диапазонов 20-77 и 63-120 между собой, что бы обороты двигателя напрямую зависили от плавующей t, при повышении t обороты повышаются, при понижении t понижаются?
вот так я запускаю контроллер, в данном коде он раскручивает движок на макс своём значении на 1.5 сек, потом сбрасывает до минимального и крутит до бесконечности, после этой манипуляции в любое время можно задавать любое значение на 3 пин в диапазоне 63-120
#include <Servo.h> Servo L; void setup() { L.attach(3); L.write(45); delay(5000); L.write(0); delay(1000); L.write(120); delay(1500); L.write(63); } void loop(){}
в этом коде я вывожу значения температуры в монитор порта
#include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 5 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); void setup(void) { Serial.begin(115200); sensors.setResolution(13); } void loop(void) { float t; sensors.requestTemperatures(); t = sensors.getTempCByIndex(0); Serial.print(t,2); Serial.println(); }
всем атас здрассте!
И Вам того же.
Как DS18B20 через дуню управляет
Вообще-то DS18B20 - это датчик. Как датчик может кем-то управлять? Да ещё и через Дуню? Дело датчика выдавать темепературу, а управлять ... ну, разве что, через Машу.
я имею ввиду что как подставить значения температуры под переменную от которой будет менятся шим
например потенциометр он же задаёт значение определённое, а теперь представим что это значение не потенциометром меняем а градусами цельсия который 18b20 даёт, отсюда вот вам и управление
под словом "дуня" я подразумеваю плату arduino uno если что)))
Функция map()
rpm = map(ds18b20_temp, 20, 77, 63, 120);
я не понимаю как присвоить rpm к L.write а потом rpm = не просто low or high, а конкретно ровнялось одной из 57 скоростей в зависимости от значения getTemp
вот что я смог сделать, но я не понимаю как значению temp присвоить показания с цифрового ds18b20 помогите пожалуйста
Что такое readTemp(0) и что там происходит?
посмогите разобраться
там должно быть считывание градусов цельсия среди этих градусов должен быть диапазон 20 - 77 ...
sensors.getTempCByIndex(0); это сам датчик ds18b20 с номером 0
С чем разобраться? Я не знаю, откуда вы взяли readTemp(0) и что оно должно возвращать.
Вы про ф-ю map() почитали? Вам понятно как она работает?
Вам нужно:
1. Прочитать температуру с датчика.
2. Подставить её в map(), которая вернёт вам величину ШИМ
3. Эту величину "скормить" мотору.
я понял смысл но как map правильно применяется нет, благодарю ...
map() - это функция линейной интерполяции значения одного диапазона в значение другого.
blabla = map(t, X1, X2, Y1, Y2)
Т.е., в вашем случае, берётся величина t (температура) и из диапазона температур 20(X1) - 77(X2) град. линейно преобразуется в диапазон ШИМ 63(Y1) - 120(Y2) и записывается в переменную blabla
А readTemp(0) вы, скорее всего откуда-то скопипастили, подозреваю, что в оригинале была отдельная функция получения температуры с датчика:
и тогда, можно читать температуру в temp
атас! получилось, работает в обоих направлениях, только на 200мс примерно прерывается в хаотичном порядке, но работает !
Это как?
сложно обьяснить, на 200 мс представьте внезапно перестаёт подаваться импульс шим на контроллер соответственно и двигатель замедляется
но происходит это не одинаково, то есть хаотично, как буд то помехи какие то или что то мешает считать
бывает крутиться по 30 сек нормально без проблем
Повыводите в монитор величину температуры. Подозреваю, что если вы используете проверку, типа
if
(temp < tempMin) { MOTORspeed = 0; digitalWrite(MOTOR, LOW); }
То при некорректном значении температуры (а с этими датчиками такое бывает) вы и получаете
"внезапно перестаёт подаваться импульс шим на контроллер соответственно и двигатель замедляется".
убрал, значения после запятой в градусах уже реже прерывается
а если больше датчиков параллельно поставить то какой бы из них не давал сбой, всё равно будет приниматься нормальные показания? или так же с ошибками?
В монитор порта какие значения выводятся?
целые числа без запятых двоичные десятизначные, градусы цельсия с задержкой ровно 1 сек примерно
полный скетч покажите
если отключить монитор порта вот так
Это полный скетч?
я предполагаю что нужно датчику все необходимые условия сделать для корректной работы если дело в нём!, сам датчик у меня в экранированном проводе
Попробуйте так -
ок сейчас...
там переменную забыли вставить int t;
она не нужна, поправьте в выводе в порт
на
Теперь нормально работает?
спасибо вам огромное, следующий шаг буду думать как вывести эти 2 значения во внешние 3ёх значные дисплеи, и буду собирать водяное охлаждение с самодельной помпой, из асинхронного двигателя, с шумоподавлением....
Ну и лады...