Пультоскоп на Arduino 27МГц!!!

Joiner
Offline
Зарегистрирован: 04.09.2014

sirota пишет:

Theodoro, начнем с того что вы не первый. ВО вторых распред коробки не удобны в виду своей угловатости. Ну и в третьих откройте для себя oled и tft экраны ) Ну и 3д печать конечно. ПРинтак тот же аня 8-я стоит 100 бачей. и пластика к ней 2-3 кг на 3 тысячи хватит на долго.

Вот бы посмотреть в готовом виде

Theodoro
Offline
Зарегистрирован: 30.05.2017

sirota пишет:

Theodoro, начнем с того что вы не первый. ВО вторых распред коробки не удобны в виду своей угловатости. Ну и в третьих откройте для себя oled и tft экраны ) Ну и 3д печать конечно. ПРинтак тот же аня 8-я стоит 100 бачей. и пластика к ней 2-3 кг на 3 тысячи хватит на долго.

Начнем с того, что я не претендовал на приоритет открытия. Во-вторых, где я утверждал, что форма коробок выдежана в пропорциях "золотого сечения"? И в-третьих, чего открывать давно открытое? Наконец, стоимость коробки 42 р. 90 к. т.е. даром.

Полагаю, надо заканчивать оффтоп.

Evg-Chugunov
Evg-Chugunov аватар
Offline
Зарегистрирован: 22.08.2015

Да не такой уж это и оффтоп. Тема корпуса для пультоскопа очень важна. Я себе собрал, как и следует из названия, в корпусе пульта от телевизора)). В распред коробках тоже отлично. Тем более это целая серия приборов. 

Evg-Chugunov
Evg-Chugunov аватар
Offline
Зарегистрирован: 22.08.2015

  Форум сглюкнул, 2 раза отправил)

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Отлично   получилось.Еще бы нутро-компановку посмотреть.

Joiner
Offline
Зарегистрирован: 04.09.2014

А мне было бы интересно продукцию sirota увидеть, на 3D принтере и с OLED и TFT.

Корпуса Theodoro понравились. Понравилось то, что устройство доведено до завершения, а не болтается как у меня, в основном, на макетках....

StingerHT
Offline
Зарегистрирован: 19.02.2018

Приветствую вас уважаемые товарищи ардуинщики.

Буду краток. Хотел собрать пультоскоп на TFT, дождался TFT из китая, припаял к ардуине, залил скетч, экран мигает, изображения нет. Видимо подсунул китаез на другом чипе экран.

Подскажите как определить что за чип в экране, и есть ли скетчи под другие чипы таких экранов?

StingerHT
Offline
Зарегистрирован: 19.02.2018

Тестовый скетч выкинул Reading ID... 0X4532

Экран предположительно на чипе LGDP4532

drauger
Offline
Зарегистрирован: 20.02.2018

Собрал вчера пультоскоп на макетке. Экран от Nokia 6021 (аналог 3220, 6100) на контроллере PCF8833, соответственно, пришлось использовать библиотеку Ucglib, модифицировав скетч. Однако, тормозит она! Никто не знает альтернативных решений под этот контроллер?

albus_homo
Offline
Зарегистрирован: 17.11.2017

Попробуйте вот эту библтотекку

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

drauger
Offline
Зарегистрирован: 20.02.2018

albus_homo пишет:
Попробуйте вот эту библтотекку

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

Это вы мне отвечали? В этой библиотеке нет поддержки PCF8833. А скетч другой не нужен, но без изменений не обойтись: в исходном скетче размеры экрана забиты цифрами.

StingerHT
Offline
Зарегистрирован: 19.02.2018

Попробовал библиотеку MCUFRIEND_kbv, просто так она этот тип экрана не поддерживает, внутри надо кое что раскоменнтить, после этого экран начал реагировать на тесты и выводить картинку.

Подключил эту библиотеку к пультоскопу и залил скетч в дуинку, заработало, но как жутко долго обновляется экран, да и ещё при нажатии на кномки, экран заваливает мусором, т.к. он перестает очищаться.... жуть... что делать?

igor777ivan
Offline
Зарегистрирован: 23.02.2018

Уважаемые специалисты! Скиньте пожалуйста скетч на пультоскоп для oled дисплея i2c (ssd1306, 1309 или spd0301).  Заранее благодарю!

satelit 2
Offline
Зарегистрирован: 04.12.2016

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

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

делитель это грубо говоря 2 резистора, а в инверторном бп смотря где лазить)))

satelit 2
Offline
Зарегистрирован: 04.12.2016

я знаю что два резистора, но кондеры до 600 вольт стоят

sirota
Offline
Зарегистрирован: 18.08.2015

И что? 

satelit 2
Offline
Зарегистрирован: 04.12.2016

жалко пультоскоп если сгорит, все собрано потом и матом нависным монтажем, да и экрана нет больше такого.

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

PS на днях загудел кулер видеокарты, смазал ВД40, помогло на пол часа. смазал оружейным маслом, полетела видеокарта, беру вторую видеокарту, устанавливаю и запускаю. плавятся дорожки на видеокарте, випадают смдешки, горит бп. ставлю другой бп, вторую видюху выкидываю. с видюхой вместе полетел монитор. монитор методом тыка завел. на материнке думаю стабилизатор питания видеокарты полетел. ТЕПЕРЬ ОСЦИЛ НУЖЕН КАК ВОЗДУХ

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

satelit 2 пишет:

 смазал ВД40, помогло на пол часа. смазал оружейным маслом, полетела видеокарта, беру вторую видеокарту, устанавливаю и запускаю. плавятся дорожки на видеокарте

Оффтоп конечно, но по моему опыту дольше всего живет моторная синтетика. Мне хватает на полгода-год.

emmm
Offline
Зарегистрирован: 06.03.2018
// http://srukami.inf.ua/pultoscop_v25110.html  \PULTOSCOP ARDUINO\~karl2233\Печатки - схемы\Os_AtMega328_DIP\Pultoscop v2 N5110-HEX\25-02-2016\PULTOSCOPE_LCD5110_final_2.ino
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <FreqCount.h> //даёт возможность аппаратно очень точно считать частоту, а программный подсчет я добавил как вынужденную меру если сигнал ниже 2,5В то счетчик аппаратный не считает и врубается программный. Он менее точен
#include <PWM.h>
#define led     9     //пин для генератора сигналов (не менять)
//########################### пользовательские настройки
//#define power 8     //пин который опрашивает кнопку включения (Нажимаете кнопку эта кнопка через диод открывает транзистор который подает питание на VCC и Ардуино стартует, )
//#define OFF  13     //пин который управляет ключем питания    (после старта ардуино уже сама высоким уровнем на ножке держит открытым транзистор.)
//#define  timepowerON 50 //время удержания кнопки выключения
#define levo   13     //кнопка ЛЕВО(можно любой пин)  12
#define ok     12     //кнопка ОК(можно любой пин)    11
#define pravo  11     //кнопка ПРАВО(можно любой пин) 10
#define akb    A5     //любой своюодный аналоговый пин для измерения напряжения АКБ 5
#define overclock 24  //Частота на которой работает Ардуино 
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 4, 3, 2);  //пины к которым у вас подключен дисплей (SLK, DIN, DC, CE, RST)
byte cont=55;         //контрастность дисплея
byte SinU=30;         //уровень синхронизации 0 до 255 
int PWM = 128;        //стартовое значение ШИМ от 0 до 255 меандр   
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.0;        //напряжение питания, меряем мультиметром
//###########################################################
//int powerON=0;   //состояние кнопки питания
byte hag=0;
int mnog=0;
boolean flag=0;
byte mass[256];  // массив с данными АЦП был 255, это позже я его увеличил под всю свободную оперативку для более длинной прокрутки в режиме паузы.
byte x=0; 
byte menu=0;      //переменная выбора меню 
bool opornoe=1;   //флаг опорного напряжения
bool paus=0;      //флаг режима паузы
bool pultoskop=1; //флаг выбора генератора или осциллографа
byte razv=0;      // стартовое значение развёртки 0-8
unsigned long count =0;
byte sinX=30;     // наверно лишнее
byte meaX=83;     // наверно лишнее
int Vmax=0;       // максимальное напряжение сигнала
byte sinhMASS=0;
long countX=0;

void setup(){  // ===================================================================================================================================================================================================================
//digitalWrite(OFF,HIGH);  //включем питание 
//Serial.begin(9600);
display.begin();
display.setContrast(cont);  
while(digitalRead(ok)==LOW){  
///////////////////////////////////////// удержание кнопки отключения
//if(digitalRead(power)==HIGH){powerON++; delay(10);}  
//if(powerON>=timepowerON)    {digitalWrite(OFF,LOW);}  //отключаем питание
///////////////////////////////////////// удержание кнопки отключения 
  if(pultoskop==1){  // Пультоскоп
    display.clearDisplay();
    display.setCursor(0,10);
    display.setTextColor(WHITE, BLACK);   //'inverted' text
    display.println("Пультоскоп");
    display.setCursor(0,20);
    display.setTextColor(BLACK); 
    display.println("Генератор");
    display.setCursor(0,40);
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("v");    
  }
    if(pultoskop==0){  // Генератор
    display.clearDisplay();
    display.setCursor(0,10);
    display.setTextColor(BLACK);        //'inverted' text
    display.println("Пультоскоп");
    display.setCursor(0,20);
    display.setTextColor(WHITE, BLACK); //'inverted' text
    display.println("Генератор");
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("v");   
  } 
if(digitalRead(levo)==HIGH) {delay(200); pultoskop=!pultoskop;}
if(digitalRead(pravo)==HIGH){delay(200); pultoskop=!pultoskop;}
delay(50);  // 50
display.display(); 
}  
if(pultoskop==1){
    FreqCount.begin(1000);   
}
if(pultoskop==0){
   InitTimersSafe(); 
   bool success = SetPinFrequencySafe(led, frequency/1.5);   // (led, frequency); 16MHz
}
display.setTextColor(BLACK);
delay(500); 
    }   
    
void Zamer(){  // Вся соль в скорости заключается в цикле считывания данных с АЦП (Zamer() - у автора, и readAdc() - у меня).
  if (razv>=6){ADCSRA = 0b11100010;}  //delitel 4
  if (razv==5){ADCSRA = 0b11100011;}  //delitel 8
  if (razv==4){ADCSRA = 0b11100100;}  //delitel 16
  if (razv==3){ADCSRA = 0b11100101;}  //delitel 32
  if (razv==2){ADCSRA = 0b11100110;}  //delitel 64
  if (razv<2) {ADCSRA = 0b11100111;}  //delitel 128
  if (razv==0){
      for(byte i=0;i<255;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          mass[i]=ADCH;
      }
  }
  if (razv>0){
      for(byte i=0;i<255;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
  }
}
void loop() {  // =========================================================================================================================================================================================================
///////////////////////////////////////// удержание кнопки отключения
//if(digitalRead(power)==HIGH){powerON++;delay(10);}  
//if(powerON>=timepowerON)    {digitalWrite(OFF,LOW);}  //отключаем питание
///////////////////////////////////////// удержание кнопки отключения    
if(pultoskop==1){  
if(opornoe==0){ADMUX = 0b11100100;}  //выбор внутреннего опорного 1,1В  A3-0b11100011  A4-0b11100100 эти строки определяют вход АЦП
if(opornoe==1){ADMUX = 0b01100100;}  //Выбор внешнего опорного          A3-0b01100011  A4-0b01100100
delay(50);  //5
if(paus==0){Zamer();}
//####################################### определение точки синхронизации
bool flagSINHRO=0;
bool flagSINHRnull=0;
for(int y=1; y<255;y++){
  if(flagSINHRO==0){if(mass[y]<SinU)    {flagSINHRnull=1;}}
  if(flagSINHRO==0){if(flagSINHRnull==1){if(mass[y]>SinU){flagSINHRO=1; sinhMASS=y;}}}}
//#######################################определение точки синхронизации
//максимальное значение сигнала##########################
Vmax=0; 
for(int y=1;y<255;y++){if(Vmax<mass[y]){Vmax=mass[y];} }
//максимальное значение сигнала##########################


//####################################### определение точки синхронизации
//####################################### отрисовка графика  
display.clearDisplay();
display.fillCircle(80,47-SinU/7, 1, BLACK);  //рисуем уровень синхронизации  (точка с правой стороны)(7, 2)
x=3;
for(int y=sinhMASS;y<sinhMASS+80;y++){
      if(razv<7){x++;}
      if(razv==7){x=x+2;}
      if(razv==8){x=x+3;}
      display.drawLine(x,   47-mass[y]/7,   x+1, 47-mass[y+1]/7-1, BLACK);  // рисует график (синусойду,меандр)
    //display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7-1, BLACK);  // рисует график вторая линия (утолщение)  
}
sinhMASS=0;
//####################################### отрисовка графика
for(byte i=47;i>5;i=i-7){display.drawPixel(0,i, BLACK); }  //display.drawPixel(1,i, BLACK); display.drawPixel(2,i, BLACK);}    //разметка экрана,  вертикальные метки по левому краю (3 раза по пикселю)
//////////////////////////////////////////////////сетка
//for(byte i=47;i>5;i=i-3){display.drawPixel(21,i, BLACK);display.drawPixel(42,i, BLACK);display.drawPixel(63,i, BLACK);} // вертикальная сетка
//for(byte i=3;i<84;i=i+3){display.drawPixel(i,33, BLACK);display.drawPixel(i,19, BLACK);}                                // горизонтальная сетка
//////////////////////////////////////////////////сетка
//####################################### отрисовка menu
if(menu==0){
    display.setCursor(0,0);
    display.setTextColor(WHITE,BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.setTextColor(BLACK); 
    display.print(" ");
    display.print(razv);
    display.print(" P");
    if(digitalRead(levo)==HIGH){opornoe=!opornoe;}
    if(digitalRead(pravo)==HIGH){opornoe=!opornoe;}    
}
if(menu==1){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.setTextColor(WHITE, BLACK); //'inverted' text 
    display.print(" ");
    display.print(razv);
    display.setTextColor( BLACK);       //'inverted' text
    display.print(" P");
    if(digitalRead(levo)==HIGH) {razv=razv-1; if(razv==255){razv=0;}}
    if(digitalRead(pravo)==HIGH){razv=razv+1; if(razv==9)  {razv=8;}}
}
if(menu==2){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(WHITE, BLACK); //'inverted' text 
    display.print(" P");
    paus=1;
    if(digitalRead(levo)==HIGH) {Zamer();}
    if(digitalRead(pravo)==HIGH){Zamer();}    
}
if(menu==3){
    paus=0;
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(BLACK);
    display.print(" P");
    if(digitalRead(levo)==HIGH) {SinU=SinU-20; if(SinU<20) {SinU=20;}}
    if(digitalRead(pravo)==HIGH){SinU=SinU+20; if(SinU>230){SinU=230;}}   
    display.fillCircle(80,47-SinU/7, 3, BLACK); //рисуем уровень синхронизации  (точка с правой стороны)(7, 5)(толстая при выборе)
    display.fillCircle(80,47-SinU/7, 1, WHITE); // 7, 2
}
if(digitalRead(ok)==HIGH){menu++; if(menu==4){menu=0; paus=0;}} //перебор меню
if (FreqCount.available()) { count = FreqCount.read();}         //вывод частоты по готовности счетчика
//####################################### частоты сигнала
byte Frec1=0;
long Frec=0;
bool flagFrec1=0;
bool flagFrec2=0;
bool flagFrec3=0;
for(int y=1;y<255;y++){
  if(flagFrec1==0){if(mass[y]<SinU){flagFrec2=1;}}
  if(flagFrec1==0){if(flagFrec2==1){if(mass[y]>SinU){flagFrec1=1;Frec1=y;}}}
  if(flagFrec1==1){if(mass[y]<SinU){flagFrec3=1;}}
  if(flagFrec3==1){if(mass[y]>SinU){
  if (razv>=6){Frec=1000000/((y-Frec1-1)*3.27);}  //delitel 4
  if (razv==5){Frec=1000000/((y-Frec1)*3.27)/2;}  //delitel 8
  if (razv==4){Frec=1000000/((y-Frec1)*3.27)/4;}  //delitel 16
  if (razv==3){Frec=1000000/((y-Frec1)*3.27)/8;}  //delitel 32
  if (razv==2){Frec=1000000/((y-Frec1)*3.27)/16;} //delitel 64
  //if (razv==2){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128 // лишняя строка
  if (razv==1){Frec=1000000/((y-Frec1)*3.27)/32;} //delitel 128
  if (razv==0){Frec=1000000/((y-Frec1)*500);}     //delitel 128
  flagFrec1=0;flagFrec3=0;}}}
//####################################### частоты сигнала
display.setTextColor( BLACK);
if(opornoe==1){
if((Vmax*VCC/255)>2.5){countX=count*(overclock/16.0);}
if((Vmax*VCC/255)<2.5){countX=Frec*(overclock/16.0);}}
if(opornoe==0){countX=Frec*(overclock/16.0);}
if(countX<1000){display.print(" ");display.print(countX);display.print("Hz");}
if(countX>1000){float countXK=countX/1000.0;display.print(countXK,1);display.print("KHz");}
if(opornoe==1){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*VCC/255,1);}
if(opornoe==0){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*1.1/255,1);}
display.print("v");
//####################################### отрисовка menu
delay(200);  // скорость переключения 
display.display();
}
if(pultoskop==0){Generator();}
}


//####################################### режим ренератора от 1 Гц до 2 МГц   ============================================================================================================================================================
void Generator(){
display.clearDisplay();  
if (flag==0){  //флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==HIGH){
              frequency=frequency-mnog;        // счёт в обратную сторону
              if(frequency<0){frequency=1;}    // {frequency=0;} ?
              bool success = SetPinFrequencySafe(led, frequency/1.5);
              delay(3);  }                     //защита от дребезга 3
            if(digitalRead(pravo)==HIGH){
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency/1.5);
              delay(3);  }                     //защита от дребезга 3
}
if (flag==1){  //флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==HIGH){
              PWM=PWM-3;
              if(PWM<0){PWM=255;} 
              delay(3);  }                      //защита от дребезга 3
            if(digitalRead(pravo)==HIGH){
              PWM=PWM+3;
              if(PWM>255){PWM=0;} 
              delay(3);  }                      //защита от дребезга 3
}      
if(digitalRead(ok)==HIGH){  //переключение разряда выбора частоты 
  delay(3);                                    //защита от дребезга 3
  hag++;
  if(hag>=6){hag=0;}       // если шагов больше 6 то переброс на шаг 0
} 
////////////
display.setTextSize(1);
display.setCursor(0,5);
display.print("PWM=");
display.print(PWM*100/255);
display.print("%");
display.drawLine(0,0,83* PWM/255.0,0,  BLACK);
display.drawLine(0,1,83* PWM/255.0,1,  BLACK);
display.drawLine(0,2,83* PWM/255.0,2,  BLACK);
display.drawLine(0,15,83*PWM/255.0,15, BLACK);
display.drawLine(0,16,83*PWM/255.0,16, BLACK);
display.drawLine(0,17,83*PWM/255.0,17, BLACK);
///////////    
display.setCursor(0,20);
display.setTextSize(2);
long frequencyX=frequency;
if(frequencyX<=999)    {display.print(frequencyX);                                   display.setTextSize(1);display.println("Hz");}
if(frequencyX>=1000)   {if(frequencyX<10000)  {display.print((frequencyX/1000.0),3); display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=10000)  {if(frequencyX<100000) {display.print((frequencyX/1000.0),2); display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=100000) {if(frequencyX<1000000){display.print((frequencyX/1000.0),1); display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=1000000){display.print((frequencyX/1000.0),0);                        display.setTextSize(1);display.println("KHz");}
if(frequencyX>2000000)frequency=1;  // если частота более 2MHz сброс на 1
display.setCursor(0,40);
display.setTextSize(1);
display.print(">> ");    
      if(hag==0){  //выбор множителя частоты
          display.print("1 Hz "); 
          mnog=1;
          flag=0;  }
      if(hag==1){  
          display.print("10 Hz "); 
          mnog=10;  }
      if(hag==2){  
          display.print("100 Hz ");
          mnog=100;   }
      if(hag==3){  
          display.print("1 KHz "); 
          mnog=1000;   } 
      if(hag==4){ 
          display.print("10 KHz "); 
          mnog=10000;  } 
      if(hag==5){  //выбор  PWM
          display.print("PWM ");
         // display.print(PWM*100/255);  // (PWM*100.0/255);
         // display.print("%"); 
          flag=1;
      } 
display.print("<<");        
pwmWrite(led, PWM);  
delay(500);  // скорость переключения 300
display.display();
}

 

emmm
Offline
Зарегистрирован: 06.03.2018

Arduino 1.8.5 \ Скетч \ Загрузить через программатор

Программатор: Arduino as ISP

Файл \ Примеры \ ArduinoISP -> Arduino Pro Mini

Можно и так более информативно - AVRdudess 2.4 (avrdude v 6.1)

Грузит с любым кварцем прямо из IDE

Joiner
Offline
Зарегистрирован: 04.09.2014

satelit 2 пишет:

........................PS на днях загудел кулер видеокарты, смазал ВД40, помогло на пол часа. смазал оружейным маслом, полетела видеокарта, беру вторую видеокарту, устанавливаю и запускаю. плавятся дорожки на видеокарте, випадают смдешки, горит бп. ставлю другой бп, вторую видюху выкидываю. с видюхой вместе полетел монитор. монитор методом тыка завел. на материнке думаю стабилизатор питания видеокарты полетел. ТЕПЕРЬ ОСЦИЛ НУЖЕН КАК ВОЗДУХ

Готовый сценарий для фильма ужасов :)

satelit 2
Offline
Зарегистрирован: 04.12.2016

фильм ужаса дошел до того, что у меня лабораторник сгорел. радуйтесь

volodya198024
Offline
Зарегистрирован: 26.12.2016

Вот ешё был-бы дополнителный вход синхронизации. Было-бы вообще замечятельно.

Novice User
Offline
Зарегистрирован: 25.09.2017

Пробовал ли кто сделать на дисплее 12864B V2 (ST7920)?

Хочу собрать на этом дисплее-поможете со скетчем?я пока разведу и вытравлю плату

Novice User
Offline
Зарегистрирован: 25.09.2017

Собрал схему,залил пример отсюда https://arduinoplus.ru/logicheskii-analizator-arduino/#___Arduino    работает,поставил подпрограмму Zamer-на экране тишина...

скетч

/***********************************
128 by 64 LCD Logic Analyzer 6 channel and 3Mb/s
By Bob Davis
Uses Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
  Copyright (c) 2012, olikraus@gmail.com   All rights reserved.

********************************************/#include "U8glib.h"
#include "U8glib.h"
// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); 
//  **** NOTE **** I Moved the three control pins !!!
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 1, 2, 3); 
U8GLIB_ST7920_128X64_4X u8g(6, 7, 8, 9, 10, 11, 12, 13, 5, 3,4); 
byte SinU=30;   //уровень синхронизации 0 до 255 
byte razv=1;
byte x=0;
bool paus=0; //флаг режима паузы
int Sample[256];
int Input=0;
int OldInput=0;
int xpos=0;
 
void u8g_prepare(void) {
  u8g.setFont(u8g_font_6x10);
  u8g.setFontRefHeightExtendedText();
  u8g.setDefaultForegroundColor();
  u8g.setFontPosTop();
}
void DrawMarkers(void) {
  u8g.drawFrame (0,0,128,64);
  u8g.drawPixel (20,1);
  u8g.drawPixel (40,1);
  u8g.drawPixel (60,1);
  u8g.drawPixel (80,1);
  u8g.drawPixel (100,1);
  u8g.drawPixel (20,62);
  u8g.drawPixel (40,62);
  u8g.drawPixel (60,62);
  u8g.drawPixel (80,62);
  u8g.drawPixel (100,62);
  
}
void Zamer(){
 // ADMUX = 0b01100011;//Выбор внешнего опорного
  if (razv>=6){ADCSRA = 0b11100010;}//delitel 4
  if (razv==5){ADCSRA = 0b11100011;}//delitel 8
  if (razv==4){ADCSRA = 0b11100100;}//delitel 16
  if (razv==3){ADCSRA = 0b11100101;}//delitel 32
  if (razv==2){ADCSRA = 0b11100110;}//delitel 64
  if (razv<2){ADCSRA = 0b11100111;}//delitel 128
  if (razv==0){
      for(int i=0;i<256;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          Sample[i]=ADCH;
      }
  }
  if (razv>0){
      for(int i=0;i<256;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          Sample[i]=ADCH;
      }
  }
  
}
void draw(void) {
  u8g_prepare();
  DrawMarkers(); 
// wait for a trigger of a positive going input
  //Input=digitalRead(A0);
 // while (Input != 1){
 //   Input=digitalRead(A0);
 // }
// collect the analog data into an array
// No loop is about 50% faster!
Zamer();
 
 x=3;
for(int y=0;y<128;y++){//for(int y=sinhMASS;y<sinhMASS+80;y++){
      if(razv<7){x++;}
      if(razv==7){x=x+2;}
      if(razv==8){x=x+3;} 
      u8g.drawLine(x, 63-Sample[y]/4, x+1, 63-Sample[y+1]/4);
      //u8g.drawLine(x+1, 63-Sample[y]/5+1, x+2, 47-Sample[y+1]/5+1);        
}
  for(int xpos=0; xpos<256; xpos++) {
    Sample[xpos]=0;
  }  
}

void setup(void) {
  //pinMode(A0, INPUT);
  //pinMode(A1, INPUT);
  //pinMode(A2, INPUT);
  //pinMode(A3, INPUT);
  //pinMode(A4, INPUT);
  //pinMode(A5, INPUT);
  ADMUX = 0b01100011;//Выбор внешнего опорного
  // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) 
    u8g.setColorIndex(255);     // RGB=white
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
    u8g.setColorIndex(3);       // max intensity
  else if ( u8g.getMode() == U8G_MODE_BW )
    u8g.setColorIndex(1);       // pixel on, black
}

void loop(void) {
// picture loop  
//  u8g.firstPage();  
  do { draw(); }  
  while( u8g.nextPage() );
  // rebuild the picture after some delay
  //delay(100);
}

 

Novice User
Offline
Зарегистрирован: 25.09.2017

получилось!

Novice User
Offline
Зарегистрирован: 25.09.2017

Что то непонятное-залил пимер отсюда http://arduino.ru/forum/proekty/mini-ostsillograf-arduino-na-lcd-5110  изменив в скетче дисплей на ST7920,работает,а тут..

Подаю синус 1 кгц,медленно повышаю уровень-на экране отображение в верхней половине и верхней не совпадают...

 

скетч

#include "U8glib.h"
//#include <EEPROM.h>
 
byte razv=6; byte mass[512];byte SinU=30;   //уровень синхронизации 0 до 255 
byte sinhMASS=0;word x=0;word y=0;
float voltageConst = 0.052381;          // Scaling factor for converting 0-63 to V
const byte theAnalogPin = 3;             // Data read pin
 
//U8GLIB_MINI12864 u8g(lcdSCK, lcdMOSI, lcdCS, lcdA0, lcdRESET);
U8GLIB_ST7920_128X64_4X u8g(6, 7, 8, 9, 10, 11, 12, 13, 5, 3,4); 

void collectData(void) {
  unsigned int tempThres = 0;
  unsigned int i = 0;

 voltageConst = 0.0523810; // 0-3.30V
 
   
  ADMUX = 0b01100011;
 if (razv>=6){ADCSRA = 0b11100010;}//delitel 4
  if (razv==5){ADCSRA = 0b11100011;}//delitel 8
  if (razv==4){ADCSRA = 0b11100100;}//delitel 16
  if (razv==3){ADCSRA = 0b11100101;}//delitel 32
  if (razv==2){ADCSRA = 0b11100110;}//delitel 64
  if (razv<2){ADCSRA = 0b11100111;}//delitel 128
  if (razv==0)
  {
      for(i=0;i<512;i++)
      { 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          mass[i]=ADCH;
      }
  }
  if (razv>0)
  {
      for(i=0;i<512;i++)
      { 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
}
//#######################################определение точки синхронизации
bool flagSINHRO=0;
bool flagSINHRnull=0;
for(y=129;y<384;y++){
  if(flagSINHRO==0){if(mass[y]<SinU){flagSINHRnull=1;}}
  if(flagSINHRO==0){if(flagSINHRnull==1){if(mass[y]>SinU){flagSINHRO=1;sinhMASS=y;
  }
  }
  }
  }
}
void handleSerial(void) {}
 
void draw(void) {
  //int i;
  char buffer[16];
   
 // u8g.setFont(u8g_font_micro);
 //u8g.drawStr(0, 5, "Av");
  // Display graph lines
 // u8g.drawLine((128-numOfSamples),0,(128-numOfSamples),63);
x=3;
 for(x=1;x<127;x++)
 //for(y=sinhMASS;y<sinhMASS+124;y++)
{
      //if(razv<7){x++;}
     // if(razv>=7){x=x+2;}
      y=x+sinhMASS;
      //if(razv==8){x=x+3;}
      u8g.drawLine(x, 64-mass[y]/5, x+1, 64-mass[y+1]/5-1);
      //display.drawLine(x+1, 64-mass[y]/5+1, x+2, 64-mass[y+1]/5-1, WHITE);        
}
sinhMASS=0;
}
 
void setup() {
//  u8g.begin();
 // Serial.begin(9600);

  delay(100);
}
 
void loop() {
  collectData();
  // Picture Display Loop
  u8g.firstPage();  
 
  do { draw(); } while( u8g.nextPage() );
  // If user sends any serial data, show menu
//  if (Serial.available() > 0) {
//    handleSerial();
 // }
 
  // rebuild the picture after some delay
  delay(100);
}

 

Novice User
Offline
Зарегистрирован: 25.09.2017

Если в строке 72 поставить 

072       y=x;

то синусоида как положено полная

Но синхронизация понятное дело не работает...

Где то здесь она зарыта...

rusoturisto
rusoturisto аватар
Offline
Зарегистрирован: 20.03.2018

Здравствуйте, купил я ардуино-нано и nokia5110, спаял на проводках схему и подал 9 вольт от маленького трансформаторного БП. Светодиод на плате не светится, на выводе "+5v" был 1вольт. Я решил, что просело напряжение из-за маленького транса. Подключил БП с трансом побольше (7,5 вольт) и через амперметр. Напряжение не увеличилось (после стабилизатора) , а ток сначала увеличился до 700 ма а затем упал до нуля. Теперь на выходе стабилизатора sa1117bh-5.0 ноль- видимо брак. Вопрос: если я выпаюю этот стаб. и припаяю на проводках КРЕН5А, но у него на выходе 5,37 в, не будет ли многовато для МК ? А вообще можно подавать напряжение на незапрограммированный МК ?

Electronik83
Offline
Зарегистрирован: 06.12.2015

Если ток поднялся до 700 мА, то скорее всего должно что то нагреться и выйти из строя. Напряжение после кренки 5.37 не повредит МК. На незапрограммированный контроллер подавать питание можно. Странные вопросы.

rusoturisto
rusoturisto аватар
Offline
Зарегистрирован: 20.03.2018

Electronik83, благодарю Вас за ответы; просто расстроился и растерялся.

condensator80
Offline
Зарегистрирован: 24.02.2018

собрал и я пультоскоп, кварц на 24 мгц поставил, всё более-менее устраивает, но есть вопрос: как сделать медленную развертку, хотя бы 1с в клетку(чтоб медленные сигналы смотреть), минимальная здешняя довольно быстрая( имею ввиду пультоскоп на дисплее Нокии 5110)

Electronik83
Offline
Зарегистрирован: 06.12.2015

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

Второй вариант - ручками редакировать код, а именно в функции Zamer есть такой код:

if (razv==0){
      for(int i=0;i<700;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          mass[i]=ADCH;
      }
  }
 
В строке  delayMicroseconds(500); - видишь число 500. Увеличивая его можно сделать более медленную развертку. Правда скорее всего увеличится время отрисовки на экране, как побочный эффект, т.к. мы сначала принимаем сигнал в буфер, потом анализируем его (синхронизация там всякая), а потом только отрисовываем.
Эксперементируй!
condensator80
Offline
Зарегистрирован: 24.02.2018

то есть получится разглядеть 1 и менее Гц? 1000мкс мало, а 10мс слишком уж медленно

condensator80
Offline
Зарегистрирован: 24.02.2018

не получил необходимого результата, просто на развертке "0" синус 1 гц не помещается на весь дисплей...не-то что хотел

Electronik83
Offline
Зарегистрирован: 06.12.2015

Дак тут надо менять весь механизм работы. Так на пальцах не объяснить, хотя я думаю, что вполне реализуемо. Надо делать отрисовку одновременно с приемом данных с аналога.. И про побочный эффект я и писал выше)))

Novice User
Offline
Зарегистрирован: 25.09.2017

При 1 Гц период 1 сек,экран 5110 84 пикселя по горизонтали,значит задержка 1/84=0,0119 сек,это конечно медленно,если делать 256 выборок то получится 3,048 сек

 

 

 

condensator80
Offline
Зарегистрирован: 24.02.2018

объясню для чего это нужно - простенький измеритель ачх на основе ГКЧ и простого амплитудного детектора, на дисплее нужно видеть саму огибающую

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

condensator80, про NWT7 знаете?  под него отличный софт.  правда он на PIC контроллере. Я сделал сам, но в впринципе на коте продаются наборы для сборки, что сильно облегчает труд по изготовлению платы.

condensator80
Offline
Зарегистрирован: 24.02.2018

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

Electronik83
Offline
Зарегистрирован: 06.12.2015

Если так надо, то могу изобразить. Только задачу по кокретней надо. И базовая прошивка какая?

condensator80
Offline
Зарегистрирован: 24.02.2018

да вообще не вопрос... базовая прошивка " Пульсометр 1" , но должны отрисовываться на дисплее очень медленные сигналы, типа как на плоттере, хоть точками, хоть вертикальными линиями, длительность развертки от 1сек до 100 мсек в клетке пульсометра, в идеале убрать генераторы из меню и включить этот ачхометр, схемотехнику уже прорабатываю, прибор задумывается как приставка к генератору DDS на AD5890 и Arduino( там есть режим Sweep)

Electronik83
Offline
Зарегистрирован: 06.12.2015

Че за пульсомер? Я такого не знаю....

Electronik83
Offline
Зарегистрирован: 06.12.2015

И как делать синхронизацию? Или ваще без нее?
"От 1 сек до 100мсек в клетке" - диаппазоны регулирвки нада. Так не очень понятно.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

condensator80, и что вы там на мелком экране разглядите ?  Есть масса универсального графического софта для писюка, можно снятые дуней данные слать через комп порт и выводить любые графики хоть в разрешении 1920*1080 . Логвью  например из простых.

condensator80
Offline
Зарегистрирован: 24.02.2018

Извините, просто у нас на работе "Пульсометры" вот и приелось название. А так это базовая прошивка "Пультометра"

condensator80
Offline
Зарегистрирован: 24.02.2018

диапазоны регулировки развертки....2-3 максимум(1000 мс- 500мс-100мс). Если б я знал как вывести медленные колебания на дисплей, хотя бы приблизительно, проблем бы не было. хотя бы приближенно видеть саму огибающую, например полосового фильтра

Novice User
Offline
Зарегистрирован: 25.09.2017

АЧХ-метр для унч?идея!привязать развертку к генератору сигналов,выдаем частоту,измеряем уровень,поднимаем частоту и так по кругу,дисплей да-лучше покрупнее...

condensator80
Offline
Зарегистрирован: 24.02.2018

можно и без выдачи частот, просто видеть саму форму