Skocz do zawartości

Robur

Użytkownicy
  • Zawartość

    6
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

Robur wygrał w ostatnim dniu 6 maja 2017

Robur ma najbardziej lubianą zawartość!

Reputacja

1 Neutralna

O Robur

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  1. Napisałem kod będący połączeniem obsługi przycisków (stoper 7.4) i regulacji podświetlenia. Zmiana podświetlenia zawsze o jeden krok niezależnie od długości wciśnięcia. Stan podświetlenia prezentowany w postaci paska na ekranie. /* 7.4 wyswietla na ekranie przewijany napis powitalny * jasnosc podswietlenie regulowana dwoma przyciskami * przyciski reaguja tylko na zmiane stanu, czyli wcisniecie i trzymanie spowoduje zmiane tylko o 1 * slupek na ekranie obrazuje poziom podswietlenia */ #include <LiquidCrystal.h> //dolaczenie biblioteki LCD #define MINUS 13 //wejscie cyfrowe do ktorego dolaczono PLUS #define PLUS 12 //wejscie cyfrowe do ktorego dolaczono MINUS #define backlight_port 9 //port do ktorego podlaczone podswietlanie, sterowanie sygnalem PWM LiquidCrystal myLCD(2,3,4,5,6,7); //inicjacja obiektu myLCD podpietego do pinow //2 RS, 3 Enable, 4 D4, 5 D5, 6 D6, 7 D7 int stan_plus=0; //stan przycisku plus int stan_plus_old=0; //poprzedni stan przycisku plus int stan_minus=0; //stan przycisku minus int stan_minus_old=0; //poprzedni stan przycisku minus int level=8; //poziom podswietlenia 1-16 tyle ile pozycji na ekranie int level_old=0; //poprzedni poziom podswietlenia potrzebne do podjecia decyzji, czy potrzebna zmiana int wypelnienie=0; //jasnosc podwsietleania void setup() { pinMode (PLUS, INPUT_PULLUP); //definicja przycisku start pinMode (MINUS, INPUT_PULLUP); //definicja przycisku stop analogWrite(backlight_port, 128); //ustawienie poczatkowego podswietlenia myLCD.begin(16,2); //okreslenie wielkosci LCD 16 znakow 2 wiersze myLCD.setCursor(0,0); //przesuniecie kursora na poczatek pierszego wiersza myLCD.print("Regulacja jasnosci podswietlania"); //wyslanie znakow na wyswietlacz for (int position=0; position<16; position++){ //przewijanie wyswietlacza, aby pokazal sie caly napis myLCD.scrollDisplayLeft(); delay(500); } myLCD.clear(); myLCD.setCursor(0,0); //przesuniecie kursora na poczatek pierwszego wiersza myLCD.print("MINUS PLUS"); myLCD.setCursor(0,1); myLCD.print(" "); //wyczyszczenie drugiego wiersza } void loop() { stan_plus=digitalRead(PLUS); stan_minus=digitalRead(MINUS); if (stan_plus!=stan_plus_old && level<16) //jesli zmienil sie stan przycisku PLUS i nie osiagnieto poziomu max if(stan_plus==HIGH) level++; //zwieksz poziom jasnosci if (stan_minus!=stan_minus_old && level>0) //jesli zmienil sie stan przycisku MINUS i nie osiagnieto poziomu max if(stan_minus==HIGH) level--; //zmniejsz pozion jasnosci stan_plus_old=stan_plus; stan_minus_old=stan_minus; if (level_old!=level){ wypelnienie=map(level,0,16,0,255); myLCD.setCursor(0,1); //przesuniecie kursora na poczatek drugiego wiersza myLCD.print(" "); //wyczyszczenie wiersza 16 spacji myLCD.setCursor(0,1); //przesuniecie kursora na poczatek drugiego wiersza for (int i=0; i<level; i++) myLCD.print(char(255)); //wyswietlenie znaku o danym kodzie ascii tutaj prostokat level_old=level; analogWrite(backlight_port, wypelnienie); } delay(50); //odstep czasy pomiedzy kolejnymi odczytami przyciskow }
  2. Treker Powodem najprawdopodobniej był niewystarczający prąd z baterii. Po dołączeniu zewnętrznego zasilania problem ustąpił. Teraz płytka stykowa jest zajęta wyświetlaczem z lekcji 7. Jak ją skończę, spróbuję odtworzyć problem i nagrać film.
  3. Poniżej mój kod do zadania 7.4 /* 7.4 wyswietla na ekranie powitalny napis * po wcisnieciu przycisku zaczyna liczyc czase i wyswietla na ekranie az do nacisniecja drugiego przycisku * po nacisnieciu drugiego przycisku zatrzymuje prace i wyswietla rezultat */ #include <LiquidCrystal.h> //dolaczenie biblioteki LCD #define START 13 //wejscie cyfrowe do ktorego dolaczono START #define STOP 12 //wejscie cyfrowe do ktorego dolaczono STOP LiquidCrystal myLCD(2,3,4,5,6,7); //inicjacja obiektu myLCD podpietego do pinow //2 RS, 3 Enable, 4 D4, 5 D5, 6 D6, 7 D7 float czas=0; //licznik czasu boolean start_test=false; //testownie czy byl wcisniety przycisk START boolean stop_test=false; //testownie czy byl wcisniety przycisk STOP void setup() { pinMode (START, INPUT_PULLUP); //definicja przycisku start pinMode (STOP, INPUT_PULLUP); //definicja przycisku stop myLCD.begin(16,2); //okreslenie wielkosci LCD 16 znakow 2 wiersze myLCD.setCursor(0,0); //przesuniecie kursora na poczatek pierszego wiersza myLCD.print("Program stoper"); //wyslanie znakow na wyswietlacz myLCD.setCursor(0,1); //przesuniecie kursora na poczatek drugiego wiersza myLCD.print("START STOP"); delay(2000); myLCD.setCursor(0,1); myLCD.print("Czas: "); } void loop() { while (digitalRead(START)==HIGH && start_test==false){} //nie rob nic az wcisniety przycisk START, sprawdza tez czy start byl wczesniej wcisniety start_test=true; //po wcisnieciu zapmietaj, ze START byl wcisniety while (digitalRead(STOP)==HIGH && stop_test==false){ //dopoki nie wcisnieto stop i stop nie byl wcisniety wczesniej rob: myLCD.setCursor(7,1); //przesun kursor myLCD.print(czas/20); //wyswietl czas zamieniony na sekundy czas+=1.00; //zwieksz licznik czasu delay(50); //czekaj 50ms; nie 1s aby nie trzeba bylo czekac 1s z nacisnietym przyciskiem STOP } stop_test=true; //jesli tutaj jestes tp znaczy, ze byl wcisniety STOP i trzeba to zapamietac myLCD.setCursor(0,1); myLCD.print("Wynik: "); //Wyswietl tylko napis wynik, czas jest juz na ekranie }
  4. Wykonując ćwiczenia z serwem mam następujący objaw. Od czasu do czasu mimo braku transmisji orczyk zaczyna „skakać” między dwoma dość odległymi pozycjami. Przykładowy scenariusz testów z zadania 5.4 1. Na początku w funkcji setup testuję zakres ruchu serwa od 0 do 180 – działa ok. 2. Podając ręcznie pozycję o wartości ok. 10 większej od aktualnej wszystko działa ok. Różnica wartości nie może być duża. 3. Podając nowa pozycję o skoku np. +100, -80, zdarza się że orczyk zaczyna „skakać”. 4. Zmienając pozycję w kierunku 0, czasem zdarza się, że zanim orczyk przesunie się do zadanej wartości, przechodzi do pozycji 0 i dopiero przesuwa się do zadanej. Np. jest w pozycji 30, podaję 20. Orczyk wraca do 0 i dopiero później idzie do 20. 5. W momencie „skoków” wysłanie kolejnej wartości pomaga ustabilizować całość i orczyk idzie do zadanej pozycji. Kondensatory filtrujące są dodane. Zmieniałem baterię na nową. Co może być przyczyną takiego zachowania? Kod programu /*odczytuje oczekiwana pozycje serwo przez USB i ustawia serwo w podanej pozycji*/ #include <Servo.h> #define SerwoPort 9 //serwo podlaczone do pinu 9 Servo SerwoMechanizm; //utworzenie serwomechanizmu String SerwoEntry=""; //pozycja serwo odczytana przez serial int SerwoPozycja = 0; //pozycja sewomechanizmu skonwertowana na int void setup() { Serial.begin(9600); Serial.println("Start pracy"); SerwoMechanizm.attach(SerwoPort); //dolaczenie serwomechanizmu SerwoMechanizm.write(0); //test zakresu pracy serwomechanizmu while (SerwoPozycja < 180) { SerwoMechanizm.write(SerwoPozycja); SerwoPozycja += 10; delay(300); } SerwoMechanizm.write(90); //koniec testu delay(2000); } void loop() { Serial.println("Podaj pozycje: "); while (Serial.available ()==0){ delay(50); } SerwoEntry = Serial.readStringUntil('\n'); //odczyt pozycji SerwoPozycja=SerwoEntry.toInt(); //konwersja pozycji na int Serial.print("Poddales: "); Serial.println(SerwoPozycja); if (SerwoPozycja>180||SerwoPozycja<0) { //sprawdzenie czy pozycja podana w ramach zakresu Serial.println("Zla wartosc! "); } else { SerwoMechanizm.write(SerwoPozycja); //przesuniecie serwa do zadanej pozycji } delay(2000); } Poniżej wstawiam jeszcze kod programu będącego połączeniem zadania 4.6 z serwo. Czyli serwo obracjące się w kierunku latarki. Objawy są takie same jak w przypadku zadania powyżej. /* Dwa fotorezystory, serwo podaza za zrodlem swiatla*/ #include <Servo.h> #define FRLeft A4 #define FRRight A5 #define SerwoPort 9 Servo SerwoMechanizm; //utworzenie serwomechanizmu int Left = 0; //wartosc z lewego fr int Right = 0; //wartosc z prawego fr int FRDiff = 0; //Roznica pomiedzy fr int SerwoPozycja = 0; //pozycja sewomechanizmu int SerwoPozycjaOld = 0; //poprzednia pozycja serwo void setup() { Serial.begin(9600); Serial.println("Start pracy"); SerwoMechanizm.attach(SerwoPort); //dolaczenie serwomechanizmu SerwoMechanizm.write(0); //test zakresu pracy serwomechanizmu while (SerwoPozycja < 180) { SerwoMechanizm.write(SerwoPozycja); SerwoPozycja += 10; delay(300); } SerwoMechanizm.write(90); delay(2000); } void loop() { Left = analogRead(FRLeft); //odczytanie lewego fotorezystora Right = analogRead(FRRight); //odczytanie prawego fotorezystora FRDiff = Left - Right; Serial.print("Lewy: "); //wartosci testowe wysylane na terminal Serial.print(Left); Serial.print(" Prawy: "); Serial.print(Right); Serial.print(" Roznica: "); Serial.print(FRDiff); if (FRDiff > 200) { FRDiff = 200; } if (FRDiff < -200) { FRDiff = -200; } SerwoPozycja = map(FRDiff, -200, 200, 20, 160); //Przemapowanie roznicy miedzy dwoma fr na pozycje serwo. Wartodc -200 i 200 zostaly wyznaczone empirycznie podczas oswietlania latarka. Serial.print(" Pozycja serwo: "); Serial.println(SerwoPozycja); //Koniec wysylania wartosci testowyhc do terminala. if (SerwoPozycja != SerwoPozycjaOld) { //Weryfikacja, czy potrzebna zmiana pozycji serwa SerwoMechanizm.write(SerwoPozycja); //jesli tak to przsun serwo SerwoPozycjaOld = SerwoPozycja; } delay(2000); }
  5. Widzę, że dawno tu nikogo nie było Niedawno zacząłem zabawę z kursem. Poniżej mój kod do zadania 4.6 Wszelkie kometarze mile widziane /* Dwa fotorezystory, linijka diodowa pokazuje, z ktorej strony jest zrodlo swiatla*/ #define FRLeft A4 //linia analogowa z podlaczonym lewym fr #define FRRight A5 //linia analogowa z podlaczonym prawym fr int Left=0; //wartosc z lewego fr int Right=0; //wartosc z prawego fr int Dioda=0; //numer diody do zapalenia int DiodaOld=0; //dioda poprzednio zapalona void setup() { Serial.begin(9600); Serial.println("Start pracy"); for (int i=2;i<=6;i++){ //inicjacja linijki diodowej oraz test zapalenia diod pinMode(i, OUTPUT); digitalWrite(i, HIGH); delay(300); digitalWrite(i, LOW); } } void loop() { Left=analogRead(FRLeft); //odczytanie lewego fotorezystora Right=analogRead(FRRight); //odczytanie prawego fotorezystora Serial.print("Lewy: "); //wartosci testowe wysylane na terminal Serial.print(Left); Serial.print(" Prawy: "); Serial.print(Right); Serial.print(" Roznica: "); Serial.print(Left-Right); Dioda=map(Left-Right,-200, 200, 2, 6); //Przemapowanie roznicy miedzy dwoma fr na numery diod do zapalenia. Wartosci -200 i 200 zostaly wyznaczone empirycznie podczas oswietlania latarka. Serial.print(" Dioda do zapalenia: "); Serial.println(Dioda); //Koniec wysylania wartosci testowych do terminala if (Dioda!=DiodaOld){ //Weryfikacja, czy potrzebna zmiana zapalenia diody digitalWrite(DiodaOld, LOW); //jesli tak to stara jest gaszona a nowa zapalana digitalWrite(Dioda, HIGH); DiodaOld=Dioda; //zapamietania jaka dioda byla poprzednio zapalona } delay(100); }
  6. Cześć, To mój pierwszy post na forum, witam wszystkich serdecznie i światecznie. Jestem w trakcie kurs, w tej chwili w dziewiątej lekcji z pierwszej części bawię się z czujnikiem odległości. Mam dwa pytania: 1. Próbowałem narysować swój schemat we Frizingu, jednak znalazłem jedynie HC-SR04 w wersji „z przodu”. Na waszym schemacie jest wersja „z góry”. Gdzie ją znaleźć? Czy dodaliście taki widok ręcznie? Poniżej widok mojego schematu. W stosunku do rzeczywistości łączenia Echo i Trig są skrzyżowane. 2. W jaki sposób wydrukować na terminalu w jednej wersji kilka wartości. Używam tego do monitorowania wartości podczas działania programu. Chodzi mi o komendę podobna do printf. Nie udało mi się znaleźć podobnej komendy. W tej chwili robię to w sposób następujący: Serial.print("Czas: "); //wydruk testowy Serial.print(EchoTime); Serial.print(" Odległość: "); Serial.print(Distance); Serial.print(" Odleglosc mapowana: "); Serial.println(DistanceConv); //koniec wydruku testowego Dzięki za odpowiedzi
×
×
  • Utwórz nowe...