Skocz do zawartości

badbit

Użytkownicy
  • Zawartość

    8
  • Rejestracja

  • Ostatnio

Reputacja

4 Neutralna

O badbit

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Cześć, moje wykonanie zadania 9.3: #define buzzPin 10 // sygnal do buzzera #define trigPin 11 // wyslanie sygnalu do czujnika #define echoPin 12 // odczyt z czujnika #define safeLed A5 void setup() { // wstepne ustawienia pinMode(echoPin, INPUT); pinMode(trigPin, OUTPUT); pinMode(A0, OUTPUT); // wyjscie A0 jako output - dioda nr 1 pinMode(A1, OUTPUT); // wyjscie A1 jako output - dioda nr 2 pinMode(safeLed, OUTPUT); // wyjscie A5 jako output - dioda wskazujaca bazpieczna odleglosc > 100 cm for (int i = 2; i <= 11; i++) { // wyjscia od 2 do 11 pinMode(i , OUTPUT); // ustawione jako output digitalWrite(i, LOW); // wstepnie sygnal niski na wszystkie wyjscia } digitalWrite(A0, LOW); digitalWrite(A1, LOW); digitalWrite(A5, LOW); } void loop() { int odleglosc = zmierzOdleglosc(); pokazOdleglosc(odleglosc); } int zmierzOdleglosc() { long czas, dystans; // proces pomiaru digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; return dystans; } void pokazOdleglosc(int odleglosc) // zapala odpowiednie diody jesli przeszkoda znajdzie sie nie dalej niz 100 cm { // // wygaszamy wszystkie diody i wylaczamy buzzer digitalWrite(A0, LOW); digitalWrite(A1, LOW); digitalWrite(A5, LOW); for (int i = 2; i <= 10; i++) { digitalWrite(i, LOW); } // przeksztalcenie zmierzonej odleglosci, aby mozna bylo uzyc jej w switch // jako wartosci calkowitej odleglosc /= 10; // dzielenie przez 10 i obciecie czesci ulamkowej odleglosc += 1; // dla poprawnosci dodajemy 1 switch (odleglosc) { case 10: digitalWrite(A0, HIGH); break; // zaczynam od 10 bo diody maja sie zapalc ponizej 1 metra case 9: digitalWrite(A1, HIGH); break; // 90 cm case 8: digitalWrite(2, HIGH); break; // 80 cm itd.. case 7: digitalWrite(3, HIGH); break; case 6: digitalWrite(4, HIGH); break; case 5: digitalWrite(5, HIGH); break; case 4: digitalWrite(6, HIGH); break; case 3: digitalWrite(7, HIGH); analogWrite(buzzPin, 10); // 30 cm - dodajemy sygnal dzwiekowy break; case 2: digitalWrite(8, HIGH); analogWrite(buzzPin, 50); // 20 cm - sygnal wyzszy break; case 1: digitalWrite(9, HIGH); analogWrite(buzzPin, 150); // 10 cm - sygnal wysoki break; default: digitalWrite(A5, HIGH); // preszkoda powyzej 1 metra - zapala sie odpowiednia dioda, reszta zgaszona } } I taki byle jaki wyświetlacz: Testy, trochę czasem niebieska mruga, ale wydaje mi się, że za mała powierzchnia "przeszkody" przy większych odległościach od czujnika. Jak zwykle proszę o wytykanie błedów.
  2. @Gieneq ok, wyrzucam delaye i dalej działa, tylko że nic nie widać! A tak poważnie to na razie chyba za trudne.
  3. Cześć, mój kod do zadania 8.4. Działa ale może jakieś sugestie? // sterowanie silnikiem (diodami) void setup() { // silnik nr 1 pinMode(6, OUTPUT); // PWM pinMode(7, OUTPUT); // w lewo pinMode(8, OUTPUT); // w prawo // silnik nr 2 pinMode(3, OUTPUT); // w lewo pinMode(4, OUTPUT); // w prawo pinMode(5, OUTPUT); // PWM } int aktualnaPredkosc; // do zapisu osiagnietej predkosci - przyda sie przy hamowaniu int maksPredkosc = 255; // do ustawienia maksymalnej predkosci void loop() { startPrawo(5, 25); // start silnikow w prawo hamuj(5, 25); // hamowanie do zera delay(2000); startLewo(5, 25); //start silnikow w lewo hamuj(5, 25); // hamowanie do zera delay(2000); } void startPrawo(int zmianaPredkosci, int opoznienie) { // ustawienie wyjsc dla silnika nr 1: obroty w prawo digitalWrite(7, 0); digitalWrite(8, 1); // ustawienie wyjsc dla silnika nr 2: obroty w prawo digitalWrite(3, 0); digitalWrite(4, 1); for (int i = 0; i <= maksPredkosc; i += zmianaPredkosci) { analogWrite(6, i); // stopniowe zwiekszanie obrotow silnikna nr 1 analogWrite(5, i); // stopniowe zwiekszanie obrotow silnika nr 2 aktualnaPredkosc = i; // zapis predkosci - zostanie uzyty przy hamowaniu delay(opoznienie); } } void startLewo(int zmianaPredkosci, int opoznienie) { // ustawienie wyjsc dla silnika nr 1: obroty w lewo digitalWrite(8, 0); digitalWrite(7, 1); // ustawienie wyjsc dla silnika nr 2: obroty w lewo digitalWrite(4, 0); digitalWrite(3, 1); for (int i = 0; i < maksPredkosc; i += zmianaPredkosci) { analogWrite(6, i); // stopniowe zwiekszanie obrotow silnika nr 1 analogWrite(5, i); // stopniowe zwiekszanie obrotow silnika nr 2 aktualnaPredkosc = i; delay(opoznienie); } } void hamuj(int zmianaPredkosci, int opoznienie) { for (int i = aktualnaPredkosc; i >= 0; i -= zmianaPredkosci) { // hamujemy od aktualnej predkosci do zera analogWrite(6, i); // stopniowe zmniejszanie obrotow do zera (silnik nr 1) analogWrite(5, i); // stopniowe zmniejszanie obrotow do zera (silnik nr 2) delay(opoznienie); } } Film (polecam wyłączyć dźwięk, bo za oknem prace):
  4. @Gieneq Dzięki za odpowiedź. Chciałem, żeby nie było " na sztywno"; żeby max wartość była obliczana w zależności od naświetlenia. Muszę sprawdzić, bo to faktycznie może bez sensu.
  5. Cześć wszystkim. Namęczyłem się z zadaniem 4.6. Działa, ale znając życie, błędy czy niedopatrzenia są więc proszę o sugestie. void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); Serial.begin(9600); } // zmienne do odczytu wartosci z fotorezystorow int fotoLewy; int fotoPrawy; void loop() { for (int i = 2; i <= 6; i++){ digitalWrite(i, LOW); // gaszenie diod } fotoLewy = analogRead(A4); fotoPrawy = analogRead(A5); // usredniona wartosc odczytow z fotorezystorow, bo u mnie byly spore roznice int sredniaFoto = (fotoLewy + fotoPrawy) / 2; int jednaDioda; // przechowa wartosc potrzebna do zaswiecenia jednej diody jednaDioda = sredniaFoto/3; // kazdy fotorezystor ma "swoje" 2 diody plus jedna "wspolna" // wiec beda trzy przedzialy i w zaleznosci... int roznicaOdczytow = fotoLewy - fotoPrawy; // ...od roznicy odczytow z fotorezystorow... // ...obliczymy numer diody do zapalenia int ktoraDioda = roznicaOdczytow / jednaDioda; if (ktoraDioda == 0) digitalWrite(4, HIGH); // srodkowa dioda if (ktoraDioda == 1) digitalWrite(5, HIGH); // pierwsza w lewo od srodkowej if (ktoraDioda > 1) digitalWrite(6, HIGH); // skrajna lewa if (ktoraDioda == -1) digitalWrite(3, HIGH); // pierwsza w prawo od srodkowej if (ktoraDioda < -1) digitalWrite(2, HIGH); // skrajna prawa } Czy w ogóle mój tok myślenia jest opdowiedni?
  6. Cześć, znam podstawy C++, więc chciałem zacząć korzystanie z Qt i trafiłem na ten kurs. Mam oryginalną płytkę Arduino Uno. Próbowałem różnych podanych sposobów, ale ciągle nie mogę otworzyć portu. W Arduino IDE wszystko działa jak należy ale w Qt nie otwiera portu. void MainWindow::on_pushButtonConnect_clicked() { static int i; if (ui->comboBoxDevices->count() == 0) { this->addToLogs("Nie wykryto urządzeń"); return; } qDebug() << ++i << " proba polaczenia."; QString portName = ui->comboBoxDevices->currentText().split("\t").first(); this->device->setPortName(portName); qDebug() << "Nazwa portu: " << device->portName() << "Czy otwarty: " << device->isOpen(); if (!device->isOpen()) { this->addToLogs("test1"); //OTWORZ I SKONFIGURUJ PORT if (this->device->open(QSerialPort::ReadWrite) ) { // <-- nie otwiera i zwraca błąd this->addToLogs("test2"); this->device->setBaudRate(QSerialPort::Baud9600); this->device->setDataBits(QSerialPort::Data8); this->device->setParity(QSerialPort::NoParity); this->device->setStopBits(QSerialPort::OneStop); this->device->setFlowControl(QSerialPort::NoFlowControl); this->addToLogs( "otwarto port szeregowy"); connect(this->device, SIGNAL(readyRead()), this, SLOT(readFromPort())); } else this->addToLogs("Port nie zostal otwarty"); } else this->addToLogs("Port juz otwarty!"); qDebug() << "test3"; } Szukaj > Połącz > Rozłącz > Włącz diodę: Wyjście:
×
×
  • Utwórz nowe...