Как DS18B20 через дуню управляет бесколлекторным двигателем через (ESC) КОНТРОЛЛЕР а? помогите пожалуйста

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

всем атас здрассте!

я новичёк, похожего много на просторах инета но, то что нужно, найти не смог, я не с пустыми руками... 

есть 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();
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Laz0vsky пишет:

всем атас здрассте!

И Вам того же.

Laz0vsky пишет:

Как DS18B20 через дуню управляет

Вообще-то DS18B20 - это датчик. Как датчик может кем-то управлять? Да ещё и через Дуню? Дело датчика выдавать темепературу, а управлять ... ну, разве что, через Машу.

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

я имею ввиду что как подставить значения температуры под переменную от которой будет менятся шим 

например потенциометр он же задаёт значение определённое, а теперь представим что это значение не потенциометром меняем а градусами цельсия который 18b20 даёт, отсюда вот вам и управление   

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

под словом "дуня" я подразумеваю плату arduino uno если что)))

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Laz0vsky пишет:
цель - как сделать зависимость диапазонов 20-77 и 63-120 между собой, что бы обороты двигателя напрямую зависили от плавующей t, при повышении t обороты повышаются, при понижении t понижаются?

Функция map()

rpm = map(ds18b20_temp, 20, 77, 63, 120);

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

я не понимаю как присвоить rpm к L.write а потом rpm = не просто low or high, а конкретно ровнялось одной из 57 скоростей в зависимости от значения getTemp

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017
вот две половинки кода в одном, далее нужны переменные по скорости и что то ещё ....
#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Servo L; 

void setup()
{
  Serial.begin(115200);
  sensors.setResolution(13); 
  L.attach(3);

   L.write(45);
     delay(5000);
   L.write(0);
     delay(1000);
   L.write(120);
     delay(1500);
   L.write(63);
}
void loop()
{
  float t; 
  sensors.requestTemperatures();
  t = sensors.getTempCByIndex(0);                                                                                                           
  Serial.print(t,2);
  Serial.println();
}

 

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

вот что я смог сделать, но я не понимаю как значению temp присвоить показания с цифрового ds18b20 помогите пожалуйста 

/////////// ЗАГРУЗКА НЕОБХОДИМЫХ БИБЛИОТЕК ///////////

#include <Servo.h>                     
#include <OneWire.h>
#include <DallasTemperature.h>    
#define ONE_WIRE_BUS 5

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

/////////// ПЕРЕМЕННЫЕ ///////////

int MOTOR = 3;
int MOTORspeed;
int temp;
int tempPin = 5;
int tempMin = 20;
int tempMax = 77;

/////////// ВКЛЮЧАЕМ КОНТРОЛЛЕР ///////////

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);
   
/////////// ПРИСВАЕВАЕМ ПИНЫ ///////////

  pinMode(MOTOR, OUTPUT);
  pinMode(tempPin, INPUT);
  
/////////// МОНИТОР ПОРТА С ТЕМПЕРАТУРОЙ /////////// 

  Serial.begin(115200);
  sensors.setResolution(13);
}

/////////// ПРИНЦИП РАБОТЫ ///////////

void loop()
{ temp = readTemp(0);   //эта строчка не работает мне не понятно как реализовать "temp" 
  if(temp < tempMin) { MOTORspeed = 0; digitalWrite(MOTOR, LOW); }
  if((temp >= tempMin) && (temp <= tempMax))
{ MOTORspeed = map(temp, tempMin, tempMax, 63, 120); }

  float t;
  sensors.requestTemperatures();
  t = sensors.getTempCByIndex(0);                                                                                                           
  Serial.print(t,2);
  Serial.println();
  
}

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Что такое readTemp(0) и что там происходит?

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

посмогите разобраться

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

там должно быть считывание градусов цельсия среди этих градусов должен быть диапазон 20 - 77 ...

 

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

sensors.getTempCByIndex(0); это сам датчик ds18b20 с номером 0

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

С чем разобраться? Я не знаю, откуда вы взяли readTemp(0) и что оно должно возвращать.
Вы про ф-ю map() почитали? Вам понятно как она работает?
Вам нужно:
1. Прочитать температуру с датчика.
2. Подставить её в map(), которая вернёт вам величину ШИМ
3. Эту величину "скормить" мотору.

sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);  //прочитали
MOTORspeed = map(temp, tempMin, tempMax, 63, 120);  // подставили                                                                                                       
L.write(MOTORspeed);// скормили

 

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

я понял смысл но как map правильно применяется нет, благодарю ... 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

map() - это функция линейной интерполяции значения одного диапазона в значение другого.
blabla = map(t, X1, X2, Y1, Y2)
Т.е., в вашем случае, берётся величина t (температура) и из диапазона температур 20(X1) - 77(X2) град. линейно преобразуется в диапазон ШИМ 63(Y1) - 120(Y2) и записывается в переменную blabla

А readTemp(0) вы, скорее всего откуда-то скопипастили, подозреваю, что в оригинале была отдельная функция получения температуры с датчика:
 

float readTemp(byte sensorIndex) {
  sensors.requestTemperatures();
  float t = sensors.getTempCByIndex(sensorIndex);
  return t;
}

и тогда, можно читать температуру в temp

float temp = readTemp(0);
Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

атас! получилось, работает в обоих направлениях, только на 200мс примерно прерывается в хаотичном порядке, но работает !   

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Laz0vsky пишет:
прерывается в хаотичном порядке

Это как?

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

сложно обьяснить, на 200 мс представьте внезапно перестаёт подаваться импульс шим на контроллер соответственно и двигатель замедляется

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

но происходит это не одинаково, то есть хаотично, как буд то помехи какие то или что то мешает считать

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

бывает крутиться по 30 сек нормально без проблем

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Повыводите в монитор величину температуры. Подозреваю, что если вы используете проверку, типа
if(temp < tempMin) { MOTORspeed = 0; digitalWrite(MOTOR, LOW); }

То при некорректном значении температуры (а с этими датчиками такое бывает) вы и получаете
"внезапно перестаёт подаваться импульс шим на контроллер соответственно и двигатель замедляется".
 

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

убрал, значения после запятой в градусах уже реже прерывается 

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

а если больше датчиков параллельно поставить то какой бы из них не давал сбой, всё равно будет приниматься нормальные показания?  или так же с ошибками?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

В монитор порта какие значения выводятся?

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

целые числа без запятых двоичные десятизначные, градусы цельсия с задержкой ровно 1 сек примерно

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

полный скетч покажите

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

если отключить монитор порта вот так 

// Serial.print(t,0);
// Serial.println();
 
разницы нет
OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Это полный скетч?

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

я предполагаю что нужно датчику все необходимые условия сделать для корректной работы если дело в нём!, сам датчик у меня в экранированном проводе 

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017
вот самый полный скетч
 
/////////// ЗАГРУЗКА НЕОБХОДИМЫХ БИБЛИОТЕК ///////////
 
#include <Servo.h>                     
#include <OneWire.h>
#include <DallasTemperature.h>    
#define ONE_WIRE_BUS 5
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 
/////////// ПЕРЕМЕННЫЕ ///////////
 
int MOTOR = 3;
int MOTORspeed;
int temp;
int tempPin = 5;
int tempMin = 20;
int tempMax = 77;
 
/////////// ВКЛЮЧАЕМ КОНТРОЛЛЕР ///////////
 
Servo L; 
 
void setup()
{
   L.attach(3);
   L.write(45);
     delay(5000);
   L.write(0);
     delay(1000);
   L.write(110);
        
/////////// ПРИСВАЕВАЕМ ПИНЫ ///////////
 
  pinMode(MOTOR, OUTPUT);
  pinMode(tempPin, INPUT);
  
/////////// МОНИТОР ПОРТА С ТЕМПЕРАТУРОЙ /////////// 
 
  Serial.begin(115200);
  sensors.setResolution(13);
}
 
/////////// ПРИНЦИП РАБОТЫ ///////////
 
void loop()
{ if(temp < tempMin) { MOTORspeed = 0; digitalWrite(MOTOR, LOW); }
  if((temp >= tempMin) && (temp <= tempMax))
{ MOTORspeed = map(temp, tempMin, tempMax, 63, 120); }
 
  float t;
  sensors.requestTemperatures();
  float temp = sensors.getTempCByIndex(0);
  MOTORspeed = map(temp, tempMin, tempMax, 63, 120);
  L.write(MOTORspeed);
  t = sensors.getTempCByIndex(0);                                                                                                           
  Serial.print(t,0);
  Serial.println();
  
}
OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Попробуйте так -

#include <Servo.h>                     
#include <OneWire.h>
#include <DallasTemperature.h>    
#define ONE_WIRE_BUS 5
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 
int MOTOR = 3;
int MOTORspeed;
int tempPin = 5;
int tempMin = 20;
int tempMax = 77;
 
Servo L; 
 
void setup()
{
   L.attach(3);
   L.write(45);
     delay(5000);
   L.write(0);
     delay(1000);
   L.write(110);

  pinMode(MOTOR, OUTPUT);
  pinMode(tempPin, INPUT);
 
  Serial.begin(115200);
  sensors.setResolution(13);
}

void loop() { 

float temp = getTemp(0);

if (temp < tempMin) { 
     MOTORspeed = 0; 
    digitalWrite(MOTOR, LOW); 
}

if((temp >= tempMin) && (temp <= tempMax))  { 
     MOTORspeed = map(temp, tempMin, tempMax, 63, 120); 
}
 
  L.write(MOTORspeed);                                                                                                         
  Serial.print(t,0);
  Serial.println();
  delay(1000);
  
}

float getTemp(byte index) {
  sensors.requestTemperatures();
  float t = sensors.getTempCByIndex(index);
  return t;
}
Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

ок сейчас...

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

там переменную забыли вставить int t;

 
всё идеально намёков на глюки нету совершенно, но в мониторе порта видно что значения двигают окно, но их не видно обсалютно пустой экран, но в окне видно что ползунок сужается
OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Laz0vsky пишет:
там переменную забыли вставить int t;

она не нужна, поправьте в выводе в порт

  Serial.print(t,0);
  Serial.println();

на

  Serial.println(temp);
  Serial.println(MOTORspeed);

 

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017


теперь температура показывается вот так сразу по 2 строчки, то есть эти данные сразу на внешний дисплей можно вывести, это rpm, и цельсий
33.94
76
33.94
76
34.00
77
33.94
76
33.94
 
 
OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Теперь нормально работает?

Laz0vsky
Laz0vsky аватар
Offline
Зарегистрирован: 18.02.2017

спасибо вам огромное, следующий шаг буду думать как вывести эти 2 значения во внешние 3ёх значные дисплеи, и буду собирать водяное охлаждение с самодельной помпой, из асинхронного двигателя, с шумоподавлением.... 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Ну и лады...