Форум ModelldepO

Форум ModelldepO (http://forum.modelldepo.ru/index.php)
-   Arduino (http://forum.modelldepo.ru/forumdisplay.php?f=220)
-   -   масштабное измерение скорости (http://forum.modelldepo.ru/showthread.php?t=18172)

xu56857 28.08.2016 18:48

масштабное измерение скорости
 
Вложений: 1
Собрал второй вариант измерялки скорости ПС , про первый вариант можно посмотреть тут:
http://forum.modelldepo.ru/showthrea...031#post278031
Во втором варианте использовал компактную PRO MINI и LCD дисплей, что позволило выдавать больше информации, также была доработана программка, питание через стабилизатор с рельс или от внешнего источника


Arduino код:

//спидометр

#include <LiquidCrystal.h>  // Лобавляем  библиотеку LCD
LiquidCrystal lcd(12115678); // (RS, E, DB4, DB5, DB6, DB7)
unsigned long time;//время срабатывания первого датчика
unsigned long time1;//время срабатывания второго датчика
 
long T;// T=(time1-time)/1000  из милисекунд в секунды
 
float T1;
 
float S1;
 
float S;
void setup()
{
  
lcd.begin(162); 
  
pinMode(3INPUT);//срабатывание датчика слева
  
pinMode(2INPUT);//срабатывание датчика справа
}

void loop()

{

 { if ((
digitalRead(2) == HIGH)  && (digitalRead(3) == HIGH)) 
  
 { 
lcd.setCursor(00); lcd.print("     READY      ");
 
 { 

  if (
digitalRead(3) == LOW)  // условие на опрос левого датчика 3-й порт

  
time millis();  lcd.setCursor(10);   lcd.print("    GO LEFT   ");
     while (
digitalRead(2) == HIGH)// счет времени пока не сработал левый датчик
    
{ }  time1 millis();
     
T=(time1-time); T1=T*0.001S=31.32/T1;
    
    
lcd.clear();lcd.setCursor(10);lcd.print(S);lcd.print(" KM/H");
    
lcd.setCursor(21); lcd.print(T1);lcd.print(" sek"); delay(3000);lcd.clear();}

  else if (
digitalRead(2) == LOW)  // условие на опрос правого датчика 2-й порт
   
    
time millis();  lcd.setCursor(10);   lcd.print("   GO RIGHT ");
    
      while (
digitalRead(3) == HIGH)// счет времени пока не сработал правый датчик
    
{ }  time1 millis();
   
T=(time1-time);  T1=T*0.001S=31.32/T1;
    
lcd.clear();lcd.setCursor(10);lcd.print(S);lcd.print(" KM/H");
    
lcd.setCursor(21); lcd.print(T1);lcd.print(" sek"); delay(3000);lcd.clear();}
 }
 }
else { 
lcd.setCursor(00); lcd.print("     xxxxx     ");delay(1000); }}


http://www.youtube.com/watch?v=HpodF...ature=youtu.be

TTenkov 28.08.2016 19:15

По Вашему первому варианту сделал и себе аналогичное устройство (благо, оставались свободные пины на Ардуине, подключенной к макету). Единственное отличие - спрятал датчики в будущие тоннели. И расстояние между ними 120 см, что больше, чем длина самого длинного состава.

мистер И.К.С. 28.08.2016 19:22

Не хватает электросхемы, крупноблочной, что куда подключено.
Какое расстояние между датчиками в миллиметрах? Также желательно указать точки по которым измерять это расстояние. Влияет ли ориентация датчиков (вертикально/горизонтально, тк там два диода) на точность измерения? НЯП цифра 31.32 это и есть коэффициент расстояние из мм в секунды?
Лучше ввести в скетче этот коэффициент (ну или хотя бы формулу по которой можно вычислить эту цифру), если вдруг последователи надумают изменить положение датчиков.
float S1 - не используется нигде.

xu56857 28.08.2016 19:55

Цитата:

Сообщение от мистер И.К.С. (Сообщение 280585)
цифра 31.32 это и есть коэффициент

как то так : м/с в км/ч (3,6) х 87 масштаб х 0,1 м ( расстояние между датчиками 100мм ) получаем 31,32

Цитата:

Сообщение от мистер И.К.С. (Сообщение 280585)
Влияет ли ориентация датчиков

практически не влияет, датчик срабатывает градусов за 10-15 ( 5-8 мм в сторону), настроены на минимальный порог срабатывания. S1 остался от промежуточных вычислений ))

BNSF9399 29.08.2016 16:47

Цитата:

Сообщение от мистер И.К.С. (Сообщение 280585)
Не хватает электросхемы, крупноблочной, что куда подключено.

Присоединюсь к пожеланию. Комплектующие уже заказал :) Хочется нормальную измерялку по разумной цене.
Сейчас секундомером пользуюсь.
http://www.youtube.com/watch?v=Xqa12nYwG2U
Нашел в проге "фичу" она по датчику освещенности может запускать и останавливать таймер. Но засечки через круг получаются.

xu56857 29.08.2016 18:00

Схемы как таковой нет, паял на "весу" )), спросил у яндекса как подключить дисплей 1602 к ардуине : http://zelectro.cc/LCD1602
и два ИК датчика FC-51, с ними все просто "-", "+" и выходной сигнал.

BNSF9399 29.08.2016 23:59

Цитата:

Сообщение от xu56857 (Сообщение 280618)
дисплей 1602

ага, значит я правильно его вычислил по картинке :)
Я вообще впервые с ардуиной решил связаться, больно уж заманчиво за 350 рублей сделать спидометр,если будут вопросы можно будет обращаться?

xu56857 30.08.2016 17:00

Цитата:

Сообщение от BNSF9399 (Сообщение 280642)
если будут вопросы

да я тоже методом научного тыка ардуину изучаю ))

BNSF9399 30.08.2016 23:19

Цитата:

Сообщение от xu56857 (Сообщение 280666)
да я тоже методом научного тыка ардуину изучаю ))

ну я конкретно по данному устройству :) Хотя, вчера полистал по вашей ссылки сайт - вроде не так страшен черт...
Попробую сделать еще мультимасштабный и км/ч-mph вариант. Теперь главное, чтобы китайские товарищи побыстрее заказ отправили, да ПР оперативно сработала, а то уже руки чешутся :)

xu56857 31.08.2016 11:12

Цитата:

Сообщение от BNSF9399 (Сообщение 280708)
еще мультимасштабный и км/ч-mph вариант

Добавить в печать еще и в милях, знаков на дисплее должно хватить, вечером попробую, примерно так:

lcd.clear();lcd.setCursor(0, 0);lcd.print(S);lcd.print("KM/H ");lcd.print(S*0.62);lcd.print("MPH");

BNSF9399 31.08.2016 12:40

Цитата:

Сообщение от xu56857 (Сообщение 280731)
Добавить в печать еще и в милях

Не... Я пару кнопок хочу поставить, км/ч-mph и HO-TT-N
Переключение по кругу с заносом в нужные переменные нужных данных.

BR95009 04.09.2016 19:57

А я собрался сделать передвижной, в вагоне. Для G масштаба. Датчик холла на колесо и Uno с lcd диспеем в вагоне.

xu56857 04.09.2016 20:22

Цитата:

Сообщение от BR95009 (Сообщение 281038)
Датчик холла на колесо

Так и пройденный путь считать можно, интересная идея, в НО тоже впихнуть можно, надо будет попробовать ))

мистер И.К.С. 04.09.2016 20:32

Цитата:

Сообщение от BR95009 (Сообщение 281038)
А я собрался сделать передвижной, в вагоне. Для G масштаба. Датчик холла на колесо и Uno с lcd диспеем в вагоне.

обычный велокомпьютер не канает? главное выбрать тот, где коэффициент диаметра колеса выставляется не в дюймах, а в миллиметрах или абстрактной 3-4 значной цифрой. даже беспроводные есть.

fleischmann 5555 таховагон был именно такой. стоял обычный sigma sport 700

http://www.galepp.com/train/tacho/tacho-e.htm

xu56857 04.09.2016 20:51

Цитата:

Сообщение от мистер И.К.С. (Сообщение 281046)
обычный велокомпьютер не канает?

наверно канает, и колесо сразу в масштабе пересчитать, но как же муки творчества? ))

BR95009 04.09.2016 21:56

Цитата:

Сообщение от мистер И.К.С. (Сообщение 281046)
обычный велокомпьютер не канает?

Не, не канает. Ардуина будет с большим экраном и большой цифрой. Скорость сразу будет видно. Опять же сделаю замер и запоминание именно максимальной.

Ардуин до оппы, экраны тоже россыпью. Вагон один модернизирую, гондоллу, магнитег приклею на двух сторонний скотч да датчик хола туда же с разъемом. А сама ардуина просто кладется в гоноллу и все. Замерил скорости, отмасштабировал сивишками, все локи отстроил, все разобрал и убрал в коробку для иных опытов. До следующего нового лока. А велокомпьютер покупать, а потом выкидывать.

BNSF9399 04.09.2016 23:00

Цитата:

Сообщение от xu56857 (Сообщение 281048)
но как же муки творчества?

да-да... хочется руками и мозгами поделать чтото. а если оно еще и 10 раз дешевле готового аналога получается...

BNSF9399 09.09.2016 12:22

Чесотка в руках сильнее, чем скорость почты России...
Купил вчера набор с UNO за "невменяемые" деньги и поковырял скетч.
Хотелось бы узнать ваше мнение по поводу временного интервала измерения.
Сейчас датчики опрашиваются каждую миллисекунду. Меня не очень вдохновляют надписи "GO LEFT"/"GO RIGHT", хочу сделать анимацию, но при тике в миллисекунду получается, естественно, полная ерунда. Если в цикл опроса добавить задержку в 10 миллисекунд, насколько сильно это повлияет на точность измерений?

BR95009 09.09.2016 19:07

Все задержки на дуне лучше реализовать с помощью функции millis().

Тогда не будет вопросов по задержкам. Скетч будет крутиться без задержек.

Вместо delay(10) пишем:

Arduino код:

unsigned long PrevMillis 0;

//...
void setup(){
      
//...
      
}

void loop{

if (
millis() - PrevMillis)>= 10{
   
PrevMillis millis(); 

   
//код, выполняемый через промежуток времени 10
   //..

     
}

//end of loop 


xu56857 09.09.2016 19:49

самый первый вариант программки для индикатора ТМ1637, у меня был именно с функцией delay(), и нечего как-то вычисляло ))) , но это все таки неправильно, надо с millis()



Arduino код:

//спидометр
#include "TM1637.h"
#define CLK 12//pins definitions for the module and can be changed to other ports       
#define DIO 11
TM1637 disp(CLK,DIO);
void setup()
{
  
disp.set(3);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
  
disp.init(D4056A);//D4056A is the type of the module
  
pinMode(3INPUT);//срабатывание датчика слева
  
pinMode(4INPUT);//срабатывание датчика справа
  
pinMode(5OUTPUT);//индикация срабатывания датчика слева
  
pinMode(6OUTPUT);//индикация срабатывания датчика справа
  
pinMode(7OUTPUT);//индикация "готов"
}

void loop()


   
int S=0int T=0disp.display(0);
  
//  if (digitalRead(3) == HIGH && digitalRead(4) == HIGH)
{
  if (
digitalRead(3) == LOW)  // условие на опрос левого датчика 3-го порта

  
{digitalWrite(5HIGH);
     while (
digitalRead(4) == HIGH)// счет времени пока не сработал правый датчик
    
delay(10); T=T+10;}
    
S=T*3.132;
   
disp.display(S);
     
delay(2000);}

  else
     
digitalWrite(5LOW);
      if (
digitalRead(4) == LOW)  // условие на опрос правого датчика 4-го порта
    
digitalWrite(6HIGH); 
      while (
digitalRead(3) == HIGH)// счет времени пока не сработал левый датчик
    
delay(10); T=T+10;}
    
S=T*3.132;
    
disp.display(S);
      
delay(2000);}
   else
     
digitalWrite(6LOW);}



BNSF9399 09.09.2016 20:30

Цитата:

Сообщение от BR95009 (Сообщение 281480)
Скетч будет крутиться без задержек.

вы наверное не поняли о чем вопрос. ваш вариант реализации тоже подойдет (я так думаю, ибо я только вчера начал с сями разбираться).
суть была в том, что в варианте автора опрос второго датчика, после срабатывания первого делается в пустом цикле

Arduino код:

while (digitalRead(2) == HIGH){} 

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

ну и к слову, в тех местах, где ТС использует delay - там if не прокатит, нужно в while запихивать.
сейчас импортну видео, покажу что у меня выходит на экране.

BNSF9399 09.09.2016 20:53

https://www.youtube.com/watch?v=_TGgUmm8zWE
Относительно варианта ТС добавлена мультимасштабность и измерение в милях и километрах в час.
настройки сохраняются и при повторном включении заново выбирать не надо.
пока все собрано на макетке на UNO с целью изучить язык ардуины и доработать код ТС под свои мысли-хотелки

BR95009 09.09.2016 21:50

Цитата:

Сообщение от BNSF9399 (Сообщение 281485)
варианте автора опрос второго датчика, после срабатывания первого делается в пустом цикле

Вариант автора предполагает однозадачность. Ваш вариант предполагает многозадачность: ждем срабатывания и крутим анимацию на дисплее. Ожидание+многозадачность делается в ардуине либо через millis либо через прерывания.

Выбирайте.

---------- Сообщение добавлено в 23:50 ---------- Предыдущие сообщение было в 23:47 ----------

Цитата:

Сообщение от BNSF9399 (Сообщение 281487)
пока все собрано на макетке на UNO

Класс! Не спешите с увековечиванием в текстолите. Если будете делать PCB по лут технологии, рекомендую прогу Fritzing. Классно получается.

BNSF9399 09.09.2016 22:07

Цитата:

Сообщение от BR95009 (Сообщение 281489)
ждем срабатывания и крутим анимацию на дисплее. Ожидание+многозадачность делается в ардуине либо через millis либо через прерывания.

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

у меня вот так выглядит

Arduino код:

    if (digitalRead(ir_left) == LOW) { // сработал левый датчик
      
time0 millis();
      
lcd.setCursor(10);
      
lcd.print("GO LEFT ");
      
int r 11;
      
char c '<';
      while (
digitalRead(ir_right) == HIGH) { // счет времени пока не сработал правый датчик
        // рисуем бегущую строку
        
lcd.setCursor(r0);
        
lcd.print(c);
        
r--;
        if(
1){
          
11;
          if(
== '<') {
            
' ';
          }
          else {
           
='<';
          }
        }
        
delay(rowDelay); // задержка перед отрисовкой следующего символа
      
}
      
// расчет скорости и вывод на дисплей
    


ПС. Вижу вы знаток, работает ли в Си вот такая конструкция?
Arduino код:

 (== '<') ? ' ' :   ='<'


BNSF9399 09.09.2016 22:21

Цитата:

Сообщение от BR95009 (Сообщение 281489)
рекомендую прогу Fritzing

От спасибо... Картинки вдохновляют, сегодня искал нечто подобное, а так и не найдя, отрисовал схему в QCad


Текущее время: 02:29. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
Copyright © ModelldepO.ru 2006 -