Нужна помощь по тахометру на Digispark-е

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Делей испортит точность. Аппаратное решение- возможно и сработает.

evgta
Offline
Зарегистрирован: 02.09.2016

Гопнег пишет:

Делей испортит точность. Аппаратное решение- возможно и сработает.

сначала смотреть с конденсатором, если непоможет, то delayMicroseconds(5); и прибавлять пока не уберется дребезг

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Ок, попробую и так, и так.

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Немного не в тему (пока не добрался до гаража, где хранятся кондёры): пытался запилить музыкальную шкатулку на дигиспарке (в подарок дочери на скорую днюху), вдохновившись видюхой про имперский марш на attiny85. Нашел код, залил в дигиспарк- не работает... При этом тот же код, залитый в нано- работает без проблем. Есть соображения по этому поводу?

const int speakerPin = 1; // Spealer is attached to the digital pin 1

// frequencies
const int c = 261;
const int d = 294;
const int e = 329;
const int f = 349;
const int g = 391;
const int gS = 415;
const int a = 440;
const int aS = 455;
const int b = 466;
const int cH = 523;
const int cSH = 554;
const int dH = 587;
const int dSH = 622;
const int eH = 659;
const int fH = 698;
const int fSH = 740;
const int gH = 784;
const int gSH = 830;
const int aH = 880;

// Beeps <ton> frequency for <time> miliseconds with a small pause to separate 
void beep(int ton, int time)
{
 tone(10, ton, time);
 delay(time + 20);
}

// Runs once on Arduino start
void setup()
{
   // shut off the speaker
 noTone(10);
}


// Runs constantly in a loop
void loop()
{
 beep(a, 500);
 beep(a, 500);
 beep(a, 500);
 beep(f, 350);
 beep(cH, 150); 
 beep(a, 500);
 beep(f, 350);
 beep(cH, 150);
 beep(a, 650);
 
 delay(150);
 //end of first bit 
 
 beep(eH, 500);
 beep(eH, 500);
 beep(eH, 500); 
 beep(fH, 350);
 beep(cH, 150);
 beep(gS, 500);
 beep(f, 350);
 beep(cH, 150);
 beep(a, 650);
 
 delay(150);
 //end of second bit... 
 
 beep(aH, 500);
 beep(a, 300);
 beep(a, 150);
 beep(aH, 400);
 beep(gSH, 200);
 beep(gH, 200); 
 beep(fSH, 125);
 beep(fH, 125); 
 beep(fSH, 250);
 
 delay(250);
 
 beep(aS, 250); 
 beep(dSH, 400); 
 beep(dH, 200); 
 beep(cSH, 200); 
 beep(cH, 125); 
 beep(b, 125); 
 beep(cH, 250); 
 
 delay(250);
 
 beep(f, 125); 
 beep(gS, 500); 
 beep(f, 375); 
 beep(a, 125);
 beep(cH, 500);
 beep(a, 375); 
 beep(cH, 125);
 beep(eH, 650);
 
 //end of third bit... (Though it doesn't play well)
 //let's repeat it
 
 beep(aH, 500);
 beep(a, 300);
 beep(a, 150);
 beep(aH, 400);
 beep(gSH, 200);
 beep(gH, 200);
 beep(fSH, 125);
 beep(fH, 125); 
 beep(fSH, 250);
 
 delay(250);
 
 beep(aS, 250); 
 beep(dSH, 400); 
 beep(dH, 200); 
 beep(cSH, 200); 
 beep(cH, 125); 
 beep(b, 125); 
 beep(cH, 250); 
 
 delay(250);
 
 beep(f, 250); 
 beep(gS, 500); 
 beep(f, 375); 
 beep(cH, 125);
 beep(a, 500); 
 beep(f, 375); 
 beep(cH, 125); 
 beep(a, 650); 
 //end of the song
 
 noTone(10);
 delay(10000);
}

Когда заливал в нано, задавал 10 пин на пищалку.

evgta
Offline
Зарегистрирован: 02.09.2016

tone() скорее всего не поддерживает

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

evgta пишет:

tone() скорее всего не поддерживает

с чего бы ?

Гопнег пишет:

Немного не в тему (пока не добрался до гаража, где хранятся кондёры): пытался запилить музыкальную шкатулку на дигиспарке (в подарок дочери на скорую днюху), вдохновившись видюхой про имперский марш на attiny85. Нашел код, залил в дигиспарк- не работает... При этом тот же код, залитый в нано- работает без проблем. Есть соображения по этому поводу?

На первом пине висит светодиод с резистором. Хотя это не мешает, залил в DIgispark, молчит,

посмотрел код, строка 27 и 35 явно указывают на 10 пин, поправил на speakerPin, запищало. 

evgta
Offline
Зарегистрирован: 02.09.2016

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

evgta
Offline
Зарегистрирован: 02.09.2016

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

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

#include <DigisparkOLED.h> // Подключил библиотеку OLED- дисплея
#include <Wire.h>
const int dath= 1;
boolean xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
unsigned int aaa = 0;
unsigned int ccc = 0;
unsigned int dreb = 50; //антидребезг
unsigned long ddd=0;

void setup() {
pinMode(dath, INPUT); // задал пин сенсора как вход
  oled.begin(); // Работаю с дисплеем
  oled.clear();
  oled.setFont(FONT8X16);
  oled.setCursor(38, 0);
  oled.print("DIGITAL");
  oled.setCursor(25, 2);
  oled.print("TACHYMETER");

}
  
  void loop() {
 if (micros()-vr1>dreb || micros()-vr2>dreb){
             if (digitalRead(dath) == HIGH && xxx == 0) { vr1 = micros(); xxx = 1; TpperUP = vr1 - vr2;  }
              if (digitalRead(dath) == LOW  && xxx == 1) { vr2 = micros(); xxx = 0; TpperDOWN = vr2 - vr1;  }
            }
Tpper=(TpperUP+TpperDOWN);
aaa=60000000/Tpper;
if (micros() - vr1>500000 || micros() - vr2>500000)  {aaa = 0;}
//if (micros() <5000000) {aaa = 0;}// !!!

if (aaa != ccc) {if (micros()-ddd>50000){disp();}}
  

}

void disp(){

oled.setCursor(60, 6);
  oled.print((aaa));
  if (aaa<100) {oled.print("       ");}
  if (aaa>=100&&aaa<1000) {oled.print("     ");}
  if (aaa>=1000&&aaa<10000) {oled.print("   ");}
  ccc=aaa;
  ddd = micros();
}

 

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

xDriver пишет:

evgta пишет:

tone() скорее всего не поддерживает

с чего бы ?

Гопнег пишет:

Немного не в тему (пока не добрался до гаража, где хранятся кондёры): пытался запилить музыкальную шкатулку на дигиспарке (в подарок дочери на скорую днюху), вдохновившись видюхой про имперский марш на attiny85. Нашел код, залил в дигиспарк- не работает... При этом тот же код, залитый в нано- работает без проблем. Есть соображения по этому поводу?

На первом пине висит светодиод с резистором. Хотя это не мешает, залил в DIgispark, молчит,

посмотрел код, строка 27 и 35 явно указывают на 10 пин, поправил на speakerPin, запищало. 

Точно, сейчас свежим взглядом увидел, что на 10-й.

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

evgta пишет:

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

Attiny85 позиционируется как кастрированная версия 8-й меги, вроде как. Да и малораспространенная еще весч, инфы мало. Зато микруха мелкая, самое оно для компактных прожектов.

evgta
Offline
Зарегистрирован: 02.09.2016

да не мелкая она по сравнению с 328p (на 1/3 меньше) стоят почти одинаково, в последних пару опытов вообще ардуины не использую, сразу чип на плату распаиваю и тут смысла тиньку использовать невижу

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

evgta пишет:

да не мелкая она по сравнению с 328p (на 1/3 меньше) стоят почти одинаково, в последних пару опытов вообще ардуины не использую, сразу чип на плату распаиваю и тут смысла тиньку использовать невижу

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

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Всем доброго.

С кодом для музыки разобрался- прикол на самом деле был в неверно указанных выводах. Исправил- музыка нарисовалась. Сейчас рисую мелодию (Happy Birthday, есснно). 

До гаража с кондёрами так пока и не добрался (работа прет, некогда выбраться).

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Во, еще вопрос: а может ли ардуинка "пищать" по 2\3\4 пинам раздельно (типа полифонии)?

evgta
Offline
Зарегистрирован: 02.09.2016

Гопнег пишет:

Всем доброго.

До гаража с кондёрами так пока и не добрался (работа прет, некогда выбраться).

последний скетч сбросил выше с антидребезгом без делей

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Ок, попробую- отпишусь.

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

evgta пишет:

Гопнег пишет:

Всем доброго.

До гаража с кондёрами так пока и не добрался (работа прет, некогда выбраться).

последний скетч сбросил выше с антидребезгом без делей

Доброго всем.

Залил скетч, поигрался с параметром dreb. Разницы между 50 и 1000 не заметил, дребезг не исчез. Думается, без гондёра все-таки не обойтись. Тем более, что вход не аналоговый, так что хуже, имхо, не будет.

evgta
Offline
Зарегистрирован: 02.09.2016

Больше можно ставить, 1000 равно 1/1000 секунды

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

evgta пишет:
Больше можно ставить, 1000 равно 1/1000 секунды

Ыыы, точно, микрос))

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Еще пришлось менять местами функции disp и loop, иначе прога не проходила компиляцию. Забыл это упомянуть.

Поиграл цифрами- все на первый взгляд в порядке. Обороты дрели и дремеля измерил кое-как, т.к. не для этой цели конструкция.

 

evgta
Offline
Зарегистрирован: 02.09.2016

В смысле местами? Скетч? У меня норм компилируется.
А что за датчик такой хреновый? Чтобы знать, а то ковырялся только с датчиком оборотов 4-х проводных вентиляторов и там проблем с дребезгом не было.

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

evgta пишет:
В смысле местами? Скетч? У меня норм компилируется. А что за датчик такой хреновый? Чтобы знать, а то ковырялся только с датчиком оборотов 4-х проводных вентиляторов и там проблем с дребезгом не было.

Геркон высокочастотный.

Да, функции переставил местами, иначе лезла ошибка декларирования функции disp.

evgta
Offline
Зарегистрирован: 02.09.2016

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

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

evgta пишет:

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

Ты об этом маздавцам\фордовцам скажи. У них датчик скорости на валу спидометра- именно такой геркон))

Про Холла в курсях, датчики с Китая едут.

infyniti
Offline
Зарегистрирован: 15.07.2017

Фильтр калмана попробуй на постоянных оборотах все пики тупит.

Жалко пропуски не вставляет

 

 

infyniti
Offline
Зарегистрирован: 15.07.2017
// переменные для калмана
float varVolt = 1.525;  // среднее отклонение (ищем в excel)
float varProcess = 0.05; // скорость реакции на изменение (подбирается вручную)
float Pc = 0.0;
float G = 0.0;
float P = 1.0;
float Xp = 0.0;
float Zp = 0.0;
float Xe = 0.0;
// переменные для калмана в шапке

//здесь лооп начинается
float filter_valy=filter(valy);//здесь свою переменную вставиш

//это после лооп
float filter(float val) {  //функция фильтрации
  Pc = P + varProcess;
  G = Pc/(Pc + varVolt);
  P = (1-G)*Pc;
  Xp = Xe;
  Zp = Xp;
  Xe = G*(val-Zp)+Xp; // "фильтрованное" значение
  return(Xe); 
}*/

 

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

infyniti пишет:

// переменные для калмана
float varVolt = 1.525;  // среднее отклонение (ищем в excel)
float varProcess = 0.05; // скорость реакции на изменение (подбирается вручную)
float Pc = 0.0;
float G = 0.0;
float P = 1.0;
float Xp = 0.0;
float Zp = 0.0;
float Xe = 0.0;
// переменные для калмана в шапке

//здесь лооп начинается
float filter_valy=filter(valy);//здесь свою переменную вставиш

//это после лооп
float filter(float val) {  //функция фильтрации
  Pc = P + varProcess;
  G = Pc/(Pc + varVolt);
  P = (1-G)*Pc;
  Xp = Xe;
  Zp = Xp;
  Xe = G*(val-Zp)+Xp; // "фильтрованное" значение
  return(Xe); 
}*/

 

В дигиспарк такое невпихуемое не впихуить))