Faktycznie masz rację Michał, mój błąd, użyłem tam innej biblioteki do LCD.
Z tą którą dałeś będzie to działać.
To teraz czekamy czy zadziała jeśli tak to możemy coś tam dalej dopisywać.
(11-10-2014 11:34)SQ9MDD napisał(a): [ -> ]"Heniek" chyba gdzieś w akcji zaginął nam.
...
Przepraszam że się tak wpycham z tym ale może koledzy mają ochotę podłubać. Jeśli ktoś ma arduino to może już testować, a kto wie może obok Heńka jakiś Złomek powstanie...
Ale się cieszę. Po cichu liczyłem że ktoś "kumaty" w ARDUINO
nie wytrzyma i temat pociągnie. Pomysł jest świetny i szkoda by
gdzieś nam zaginął. Jam prosty mechanik, potrafię gotowy kod
przejrzeć i czasami coś zmodyfikować ale nie napisać od zera.
Zaczynam gromadzić klocki.
No i super widzę że nawet jest zainteresowanie wspólnym pisaniem synezera.
No to postanowiłem że nieco wyprostuję ten kod.
I tak:
- zmieniłem jednak bibliotekę do obsługi LCD gdyż pojawiały się problemy z kontrastem wyświetlacza przy poprzedniej.
- przeniosłem wyświetlanie częstotliwości do osobnej funkcji tak by można było z jednego miejsca kontrolować sposób wyświetlania częstotliwości.
Następne co zrobić trzeba koniecznie to wprowadzenie pośredniej, i obsługę zmiany kroku syntezera.
Odpalajcie sprzęty jak będzie działać to piszemy dalej.
Kod:
//************************************************************************//
// Złomek - kumpel Heńka, projekt pogladowy obsługi DDS AD9850,
// wyświetlacza nokii 5110 i jakiegoś enkodera.
// Projekt otwarty http://sp-hm.pl
// SQ9MDD - początkowy szkielet programu v 1.0.0
// S_____ -
// S_____ -
//
//************************************************************************//
/* CHANGELOG (nowe na górze)
2014.10.12 - początek projektu wspólnego na sp-hm.pl
wymiana biblioteki wyświetlacza lcd na LCDD5110 basic
2014.05.22 - pierwsza wersja kodu warsztaty arduino w komorowie.
*/
//************************************************************************//
//podłączamy bibliotekę syntezera
#include <AH_AD9850.h>
//inicjalizujemy enkoder
//AO - w lewo
//A1 - w prawo
//nalezy pamiętać o kondensatorach (100nF) pomiędzy liniami encodera a masą
RotaryEncoder encoder(A0,A1,5,6,1000);
//kontrast wyświetlacza
const int kontrast = 70;
//zmienna pomocnicza do wyrzucania danych na lcd
char buffor[] = " ";
//zmienna dla częstotliwości, wstawiamy tam częstotliwość od której startujemy
long czestotliwosc = 3710000;
//zmienna pomocnicza do liczenia impulsów z enkodera
int enc_sum = 0;
//funkcja do obsługi wyświetlania zmiany częstotliwości
void show_frequency(){
lcd.setFont(SmallFont); //ustawiamy czcionkę
sprintf(buffor,"%lu",czestotliwosc); //konwersja danych do wyświetlenia (ładujemy longa do stringa
lcd.print(buffor,CENTER,0); //wyświetlamy dane na lcd
}
// setup funkcja odpalana przy starcie
void setup(){
//odpalamy syntezer i ustawiamy częstotliwość startową
AD9850.set_frequency(0,0,czestotliwosc); //set power=UP, phase=0, 1MHz frequency
delay(1000); //sekunda opóźnienia
lcd.InitLCD(kontrast); //odpalamy lcd ustawiamy kontrast
show_frequency(); //pokazmy cos na lcd
}
void loop(){
//czytamy wartość z encodera
int enc = encoder.readEncoder();
if(enc != 0) { //jeśli wartość jest inna niż zero sumujemy
enc_sum = enc_sum + enc; //jeden ząbek encodera to +2 lub -2 tutaj to zliczam
}
//jesli zaliczyliśmy ząbek dodajemy lub odejmujemy do częstotliwości wartość kroku (na razie na sztywno 100Hz)
if(enc_sum >= 2){
czestotliwosc = czestotliwosc + 100; //docelowo czestotliwosc = czestotliwosc + krok
AD9850.set_frequency(czestotliwosc); //ustawiam syntezę na odpowiedniej częstotliwości
show_frequency(); //drukuję częstotliwość na wyświetlaczu za pomocą gotowej funkcji
enc_sum = 0; //reset zmiennej zliczającej impulsy enkodera
}
if(enc_sum <= -2){
czestotliwosc = czestotliwosc - 100; //docelowo czestotliwosc = czestotliwosc - krok
AD9850.set_frequency(czestotliwosc); //ustawiam syntezę na odpowiedniej częstotliwości
show_frequency(); //drukuję częstotliwość na wyświetlaczu za pomocą gotowej funkcji
enc_sum = 0; //reset zmiennej zliczającej impulsy enkodera
}
delayMicroseconds(5); //małe opóźnienie dla prawidłowego działania enkodera
}
U mnie przestraja co 200Hz, na LCD i w rzeczywistości. Pomiar na liczniku częstotliwości. Enkoder jest mechaniczny za 2,40zł (czy coś takiego).
Rysio!
PS. U mnie jeden ząbek enkodera to cyfra 4. Należy tą wartość zmienic w programie na 4, co też uczyniłem. Teraz jest OK!
Ha, to pewnie inaczej działający enkoder. Zrób Ryśku taki test, w funkcji setup włącz port szeregowy:
Kod:
Serial.begin(9600);
A następnie podczas odczytywania enkodera wyświetl ile masz impulsów na ząbek:
Kod:
if(enc != 0) { //jeśli wartość jest inna niż zero sumujemy
enc_sum = enc_sum + enc; //jeden ząbek encodera to +2 lub -2 tutaj to zliczam
Serial.println(enc); //<---- to dorzucamy
}
Pewnie u Ciebie jest inaczej niż w tym moim i dlatego skacze po 200Hz
I teraz w zasadzie możemy albo zmienić krok albo inaczej zliczać impulsy.
Właściwa zmiana powinna się odbywać tutaj:
Kod:
if(enc_sum >= 2){
i tutaj:
Kod:
if(enc_sum <= -2){
Zamieniamy dwójkę na wartość jaką masz na ząbek. W sumie najlepiej to wystawić jako zmienną do konfiguracji.
Tu go kupiłem: http://electropark.pl/szukaj?orderby=pos...rch=Szukaj 24kroki/obrót, cena jest już trochę wyższa.
Zmieniłem krok liczenia, napisałem wcześniej PS do info poprzedniego.
Rysio!
PS. Andrzeju!
Nie masz co kombinować, każde Arduino jest tu dobre do ćwiczeń. Ja mam DUEMILANOWE. Każde Arduino chodzi na kwarcu 16MHz, u mnie siedzi ATmega 328P.
PS2. Faktycznie, ładnie czyta na porcie szeregowym, dostaję 4 jedynki....ale jak wcześniej już napisałem, poprawiłem w programie cyfrę 2 na 4, jest OK!