Przeszukaj forum
Pokazywanie wyników dla tagów 'Problem'.
Znaleziono 37 wyników
-
Witam. Nie ładuje mi się kurs elektroniki 1 na stronie przez co nie mogę z niego skorzystać. Proszę o pomoc. :)
-
Witam, podczas wykonywania zadań w części #6 2 kursu arduino na tej stronie dotyczącego wyświetlaczy 7 segmentowych natknąłem się na problem. Mianowicie, niektóre znaki (0, 2, 3, C) nie są wyświetlane tak jak należy, czy to podczas własnoręcznego ustawiania segmentów tak jak jest w kursie, czy podczas korzystania z biblioteki SevSeg. Wszystkie podłączenia oraz kody są zrobione tak jak w kursie oraz dokładnie sprawdzone. w załącznikach podane kolejno zdjęcia wyświetlania liczb 23,04,78. Tak jak widać, niektóre liczby są wyświetlane poprawnie, a niektóre nie. Będę wdzięczny za udzielenie pomocy lub rad związanych z tym problemem
- 1 odpowiedź
-
- Arduino
- wyświetlacz
-
(i 1 więcej)
Tagi:
-
Cześc chce stworzyć urządzenie które po wbiciu odpowiedniego numeru na klawiaturze zaczyna grać odpowiednią melodie zapisaną na karcie sd. Większość problemów udało mi sie rozwiązać, lecz na obecny nie jestem w stanie znaleźć rozwiązania. Mianowicie jak mam podłączoną klawiature, czytnik kart sd i głośnik któryś z komponentów nie działa (prawdo podobnie czytnik). Arduino zgodnie z programem sprawdza podłączenie wszystkich elementów jednakże nie odgrywa nagrania testowego. Klawiatura działa czytnik teoretycznie też, ale nie da się odtworzyć żadnego dźwięku. Jeśli ktoś jest w stanie mi pomóc to proszę o odpowiedź, poniżej zamieszczam konfiguracje urządzenia i kod. #include <Arduino.h> #include <Keypad.h> #include <SD.h> // need to include the SD library //#define SD_ChipSelectPin 53 //example uses hardware SS pin 53 on Mega2560 #define SD_ChipSelectPin 4 //using digital pin 4 on arduino nano 328, can use other pins #include <TMRpcm.h> // also need to include this library... #include <SPI.h> // C++ code //#define buzer A0; TMRpcm tmrpcm; unsigned long time = 0; const byte ROWS = 5; const byte COLS = 4; byte rowPins[ROWS] = {A5, A4, A3, A2, A1}; byte colPins[COLS] = {5, 3, 2, 0}; char keys[ROWS][COLS] ={ {'3','2','1'}, {'7','6','5'}, {'*','0','9'}, {'.','8',','}, {'e','w','4'} }; Keypad klawiatura = Keypad(makeKeymap(keys), rowPins,colPins,ROWS,COLS); String tekst; const String tel_book[2] = {"123","321"}; // tu wpisujemy numery pod którymi znajdują sie scieżki dźwiękowe char* track_list[2] = {"test.wav","cos2.wav"}; // tu wpisujemy nazwy ścieżek dźwiekowych int lokalizator; void setup() { tmrpcm.speakerPin = 10; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc //Complimentary Output or Dual Speakers: //pinMode(10,OUTPUT); Pin pairs: 9,10 Mega: 5-2,6-7,11-12,46-45 Serial.begin(9600); pinMode(13,OUTPUT); //LED Connected to analog pin 0 | w sumie to nie wiem ale bez tego nie działa if (!SD.begin(SD_ChipSelectPin)) { // sprawdza czy karta sd jest poprawnie zainstalowana na miejscu Serial.println("SD fail"); return; // jeśli nie to wyłącza program } else{ Serial.println("SD ok"); } tmrpcm.play("test.wav"); // odgrywa testowy dźwięk po włączeniu urządzenia tmrpcm.volume(4); } void loop() { char klawisz = klawiatura.getKey(); // pobiera dane z klawiatury i przypisuje do zmiennej if (klawisz) { tekst += klawisz; //wybieranie numeru Serial.println(tekst); if (tekst.length()==3) // gdy długość numeru jest odpowiednia zaczyna szukac go w książce telefonicznej { for (int i = 0; i < sizeof(tel_book); i++) { if (tel_book[i] == tekst) { lokalizator = i; // po znaleziemiu odpowiedniego numeru wybiera jego pozycje z listy tekst = ""; }else{ tmrpcm.play("9999.wav"); // odtworzenie informacji o błednie wybranym numerze } } } } // wcześniej odnaleziony numer inicjuje odtworzenie odpowiedniej ścieżki dźwiękowej tmrpcm.play(track_list[lokalizator]); // to powinno już działac ale jeszcze nie wiem czy tak jak chce }
-
Witam. Przyszedł mi dzisiaj oscyloskop który kupiłem przez internet. Po włączeniu nic się nie dzieje. Właściwie to prawie nic bo na wyświetlaczu nic się nie pojawia, dioda power się nie świeci, ale zauważyłem że przy włączaniu dioda triggered bardzo delikatnie świeci i po chwili przestaje. Zacząłem kręcić pokrętłem przy włączonym oscyloskopie i odkryłem że ustawienie pokrętła na bardzo dokładną pozycje powoduje miganie diody triggered ze stałą częstotliwością i jak zakładam pełną jasnością. Próbowałem parę razy, czasem częstotliwość migania jest większa, czasem mniejsza. Ale raczej nie ma to znaczenia. Pomimo braku zasilania ono jednak jest? Nie rozumiem tego. Nie wiem jak zabrać się za naprawę tego oscyloskopu. Pani która mi go sprzedała twierdzi że na pewno działał jeszcze przed wysłaniem. Dodam że w temacie oscyloskopów jestem totalnie zielony. Mam pełne wyposażenie, oscyloskop miał jeszcze plomby. Szkoda jakby taki sprzęt się zmarnował. Byłbym wdzięczy za jakiekolwiek porady, schematy i informacje. Z góry dzięki za pomoc.
-
Cześć. Na wstępnie chciałem uprzedzić, że nie do końca jestem programistą albo automatykiem, chociaż studia techniczne niedawno właśnie skończyłem. Mam taki mini projekt, w którym potrzebne jest zrobienie sterowania na mikrokontrolerze podpiętym do jakiegoś SBC po UART'cie (albo innej, podobnej magistrali). Potrzebuję, żeby komunikacja między SBC i mikrokontrolerem była możliwie jak najbardziej płynna i responsywna (tj. przesyłanie poleceń sterujących zawierających m.in. nastawy regulatorów wyglądało dla człowieka prawie jak real-time (nie musi być faktycznie real-time)). Żeby być jasnym to nie pytam o wybór magistrali, jej konfigurację, czy o platformę do wykorzystania. Chodzi mi raczej ściśle o to, jak zrealizować komunikację, żeby używając cyfrowych magistrali/protokołów stworzyć iluzję ciągłości w przesyle informacji sterujących - czyli, nazwijmy to metaforycznie, iluzję przesyłu informacji poprzez ciągłe sygnały analogowe. Obrazowym przykładem byłyby te wszystkie tańsze drony, które opierają się o komunikację po WiFi ze smartfonem, gdzie joysticki kontrolera pozwalają na dość responsywne zdalne sterowanie, a jednocześnie cały system komunikacji działa cyfrowo i pozwala na przykład strumieniować obraz z kamery. Niestety nie miałem na studiach w ogóle takich zagadnień, a są mi akurat teraz potrzebne. Chciałbym zrobić to porządnie. Na razie mam to zrobione tak, że po prostu przesyłam odpowiednie ciągi bajtów w jakichś tam odstępach czasowych z dużą częstotliwością. No, ale nie czuję, żeby to było dobre. Na pewno jest mądrzejszy sposób. Jeśli bełkoczę albo temat jest zbyt rozległy to chętnie przygarnę też informacje o jakichś źródłach - artykułach, filmikach, książkach. Dziękuję.
- 4 odpowiedzi
-
Dobra a więc tak robie swój pierwszy projekt czyli mój gameboy i żeby jakoś zasilić arduino kupiłem baterie lipo 1000mah 3,7v i moduł solar charger shield od seeed naładowałem baterie i podłączyłem moduł do arduino wgrałem kod na gameboya i włączyłem zasilanie a dioda na arduino sie zaswieciła na zielono lecz arduino nie wykonuje kodu czy ktoś może mi coś poradzić?
-
Cześć, zbudowałem robota kroczącego składającego się z 12 serw. 4x serwo typu medium (Power HD HD-1160A z plastikowymi przekładniami) i 8x serwo typu micro (MG-90S z metalowymi przekładniami), serwa zasilane są battery Packiem (4x bateria AA 1,5V) 6V oraz Arduino mega, które zasilam 5V. Po wykonaniu dwóch kroków robot się zapada i serwa medium się wyłączają (serwa umieszczone na ramie robota) a serwa micro działają i wykonują dalsze ruchy nogi. Podejrzewam, że problem leży przy zasilaniu robota, battery pack dodaje masy do robota i może być niezbyt optymalnym źródłem prądu. Po podłączeniu woltomierza, miernik pokazywał ~5V zamiast wymaganego 6V. Drugim problemem mogą być serwera medium, jakich używam, przy 6V ruch obrotowy serwa wynosi 2,7 kg*cm a serwa micro nogi mają 2,2 kg*cm również przy 6V. Po ściągnięciu battery packa, robot działał dobrze do pewnego momentu, gdy się zawalił, serwa przestały być „naprężone” co wynikało by z braku odpowiedniego zasilania. Czy ktoś z Was wie, gdzie może leżeć przyczyna problemu? Z góry dziękuje. Film z działania robota oraz zdjęcie nogi w załącznkiu poniżej:
-
Mam problem. Mianowicie budując moją stację meteo na układzie Arduino Uno natknąłem się na błąd "SSD1306 allocation failed". Wywnioskowałem, że błąd ten powoduje zbyt mała ilość pamięci RAM dla wyświetlacza oraz że tą pamięć zabierają zmienne "char" wykorzystywane w moim kodzie. Program działał, gdy występowały dwie zmienne "char", teraz zaimplementowane są trzy, a mam w planach dodać jeszcze kilka. Poniżej dodaje kod całego programu modułu odbiornika stacji, do którego podłączony jest wyświetlacz. Jeżeli ktoś miałby jakieś rady co do sposobu pisanie kodu, lub zauważył w moim jakieś błędy, proszę śmiało pisać, gdyż nie jestem specem od pisania kodu. Wolę kabelki i lutownicę. 😉 Z góry dziękuję za odpowiedź. #include <SPI.h> #include <Wire.h> #include <VirtualWire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Adafruit_BMP280.h> #include "DHT.h" #include <virtuabotixRTC.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define DHTPIN 2 // Pin, do którego podłączony jest DHT 11 #define DHTTYPE DHT11 // Typ czujnika DHT #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); Adafruit_BMP280 bmp280; DHT dht(DHTPIN, DHTTYPE); virtuabotixRTC myRTC(6, 7, 8); const int receive_pin = 3; char temperatureChar[10]; char humidityChar[10]; char pressureChar[10]; struct package { float temperature = 0.0; float humidity = 0.0; float pressure = 0.0; }; typedef struct package Package; Package data; void setup() { Serial.begin(9600); dht.begin(); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } myRTC.setDS1302Time(00, 9, 15, 6, 01, 06, 2023); // Ustawienie zegara display.display(); delay(2000); display.clearDisplay(); //Wyczyszczenie ekranu vw_set_rx_pin(receive_pin); vw_setup(500); // Bits per sec vw_rx_start(); // Start the receiver PLL running } void loop() { float h = dht.readHumidity(); // Odczyt wilgotności wewnętrznej float t = dht.readTemperature(); //Odczyt temperatury wewnętrznej if (isnan(h) || isnan(t)) { Serial.println(F("Failed to read from DHT sensor!")); return; } float hic = dht.computeHeatIndex(t, h); uint8_t buf[sizeof(data)]; uint8_t buflen = sizeof(data); if (vw_have_message()) { for (int i = 0; i < 5; i++) { myRTC.updateTime(); delay(1050); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.print(" Data: "); display.setTextSize(2); display.println(); display.println(); display.setTextColor(WHITE); display.print(myRTC.dayofmonth); display.print("/"); display.print(myRTC.month); display.print("/"); display.print(myRTC.year); display.print(" "); display.print(myRTC.hours); display.print(":"); display.print(myRTC.minutes); display.print(":"); display.print(myRTC.seconds); display.display(); display.clearDisplay(); } delay(2000); //Odczyt temperatury wewnętrznej display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Temperatura WEW.:"); display.println(); display.setTextSize(3); display.setTextColor(WHITE); display.print(t); display.print(" C"); display.display(); display.clearDisplay(); delay(2000); //Odczyt wilgotności wewnętrznej display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Wilgotnosc WEW.:"); display.println(); display.setTextSize(3); display.setTextColor(WHITE); display.print(h); display.print(" %"); display.display(); display.clearDisplay(); delay(2000); Serial.print(F("Temperatura wew.: ")); Serial.print(t); Serial.print(F("°C Wilgotność wew.: ")); Serial.print(h); Serial.print(F("% ")); Serial.println(); vw_get_message(buf, &buflen); //Odczyty z odbiornika zewnętrznego memcpy(&data,&buf,buflen); Serial.print(data.temperature); //Wypissanie odczytów na terminalu String temperatureString = String(data.temperature,1); temperatureString.toCharArray(temperatureChar,10); Serial.println(); Serial.println(data.humidity); String humidityString = String(data.humidity,1); humidityString.toCharArray(humidityChar,10); Serial.println(); Serial.print(data.pressure); String pressureString = String(data.pressure,1); pressureString.toCharArray(pressureChar,10); Serial.println(); display.setTextSize(1); //Odczyt temperatury zewnętrznej display.setTextColor(WHITE); display.setCursor(0,0); display.println("Teperatura ZEW.:"); display.println(); display.setTextSize(3); display.setTextColor(WHITE); display.print(data.temperature); display.print(" C"); temperatureString.toCharArray(temperatureChar,10); display.display(); display.clearDisplay(); delay(2000); //Odczyt wilgotności zewnętrznej display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Wilgotnosc ZEW.:"); display.println(); display.setTextSize(3); display.setTextColor(WHITE); display.print(data.humidity); display.print(" %"); humidityString.toCharArray(humidityChar,10); display.display(); display.clearDisplay(); delay(2000); //Odczyt ciśnienia display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Cisnienie.:"); display.println(); display.setTextSize(3); display.setTextColor(WHITE); display.print(data.pressure); display.print(" hPa"); pressureString.toCharArray(pressureChar,10); display.display(); display.clearDisplay(); delay(2000); } }
- 3 odpowiedzi
-
- 1
-
-
- Arduino
- Stacja pogodowa
-
(i 1 więcej)
Tagi:
-
Witam jestem na poziomie początkującym można powiedzieć nooba 😉 no i sobie działam czytam itd. kurs forbot podstawy elektroniki 1 no i nagle stop... Przy dzielniku napięcia mam pytanie bo w kursie jest taki przykład są 2 oporniki jeden ma 1kΩ a drugi ma 220Ω i jest zasilanie 3v no i dalej obliczenie Uwyj → Uzas = 3v to rozumiem dobra dalej R1+R2 = 1,22 kΩ mi wyszło 0,22 a skąd te 1 pierwsze? Następnie Uwyj = 3v • 1kΩ/1,22kΩ to rozumiem ale tamto ↑ noni mi wyszło chyba (bo to wcześniej liczyłem) 2,4590 Uwyj =2,46 V proszę czy ktoś mi wytłumaczyć proszę i przepraszam za to głupie pytanie no ale... Nie potrafie to na pewno jest takie proste... Proszę o odpowiedz pozdrawiam :)
-
Niepoprawne działanie silników z L293D podłączonego do Arduino UNO
Dabz opublikował temat w Arduino i ESP
Witam wszystkich, na wstępie zaznaczę, że jestem początkującym elektronikiem oraz robię projekt do szkoły. Owym projektem jak wspomniałem w tytule jest autko na bazie Arduino UNO, L293D i modułu bluetooth HC-05 Sugerując się poradnikami postanowiłem zrobić projekt i podłączyć go według schematu poniże Już na początku napotkałem pewne problemy, ponieważ podłączenie zasilania na samą płytkę L293D (płytka jest wpięta bezpośrednio w Arduino) moduł HC-05 nie dział, więc rozdzieliłem kable i podłączyłem osobno L293D i Arduino UNO z jednego akumulatora i teoretycznie zadziałało. Lecz jak wgrałem kod (wszystko jak należy RX, tx zmieniłem i wyjąłem przed programowaniem) i połączyłem z aplikacją działa mi tylko przycisk tył i prawo. Jak klikam lewo i przód silniki zaciskają się i autko jedzie bez przerwy, a sam moduł się rozłącza i gubi zasięg z aplikacją. W czym może być problem???? Tutaj podsyłam jeszcze kod #include <AFMotor.h> //initial motors pin AF_DCMotor motor1(1); AF_DCMotor motor2(2); AF_DCMotor motor3(3); AF_DCMotor motor4(4); char command; void setup() { Serial.begin(9600); //Set the baud rate to your Bluetooth module. } void loop(){ if(Serial.available() > 0){ command = Serial.read(); Stop(); //initialize with motors stoped //Change pin mode only if new command is different from previous. //Serial.println(command); switch(command){ case 'F': forward(); break; case 'B': back(); break; case 'L': left(); break; case 'R': right(); break; } } } void forward() { motor1.setSpeed(255); //Define maximum velocity motor1.run(FORWARD); //rotate the motor clockwise motor2.setSpeed(255); //Define maximum velocity motor2.run(FORWARD); //rotate the motor clockwise motor3.setSpeed(255);//Define maximum velocity motor3.run(FORWARD); //rotate the motor clockwise motor4.setSpeed(255);//Define maximum velocity motor4.run(BACKWARD); //rotate the motor anti-clockwise } void left() { motor1.setSpeed(255); //Define maximum velocity motor1.run(BACKWARD); //rotate the motor anti-clockwise motor2.setSpeed(255); //Define maximum velocity motor2.run(BACKWARD); //rotate the motor anti-clockwise motor3.setSpeed(255); //Define maximum velocity motor3.run(FORWARD); //rotate the motor clockwise motor4.setSpeed(255); //Define maximum velocity motor4.run(FORWARD); //rotate the motor clockwise } void right() { motor1.setSpeed(255); //Define maximum velocity motor1.run(FORWARD); //rotate the motor clockwise motor2.setSpeed(255); //Define maximum velocity motor2.run(FORWARD); //rotate the motor clockwise motor3.setSpeed(255); //Define maximum velocity motor3.run(BACKWARD); //rotate the motor anti-clockwise motor4.setSpeed(255); //Define maximum velocity motor4.run(BACKWARD); //rotate the motor anti-clockwise } void Stop() { motor1.setSpeed(0); //Define minimum velocity motor1.run(RELEASE); //stop the motor when release the button motor2.setSpeed(0); //Define minimum velocity motor2.run(RELEASE); //rotate the motor clockwise motor3.setSpeed(0); //Define minimum velocity motor3.run(RELEASE); //stop the motor when release the button motor4.setSpeed(0); //Define minimum velocity motor4.run(RELEASE); //stop the motor when release the button } -
Witam, Jestem w 8 klasie (co pewnie da się wyczuć 🙂 ) i robię robota, który omijałby przeszkody i wracał na trasę z wykorzystaniem HC-SR04 i MPU-6050. Używam też shielda od forbota, omawianego w kursie robotyki. Nieruchomy czujnik działa prawidłowo, ale kiedy obraca się na serwie, w pozycjach około prostopadłych do tylnej osi daje odczyt 0 cm. Pozostałe odczyty są poprawne, samo podłączenie czujnika też jest w porządku, bo działa bardzo dobrze będąc nieruchomym. Założenie jest takie, żeby czujnik zamontowany na serwie wykonywał pomiary odległości wokół robota, a następnie aby serwo obróciło się tam, gdzie odległość była najmniejsza (to pozwala cały czas monitorować najbliższą przeszkodę). Cały ,,układ" jest bardzo prosty, w zasadzie można go zreplikować w 5 minut i potestować z moim kodem. Poza tym, zamieszczony plik .zip to minutowy film, który pokazuje zarówno ruchy serwa, jak i odczyty podawane na port szeregowy (Forobot nie pozwala na przesyłanie .mp4). Cały kod zdaje się działać dobrze, jedynym problemem jest to, że pomiary bywają zerowe, co sprawia, że czujnik zachowuje się bez sensu. Myślałem nad dodaniem prostego warunku: ,,Jeżeli zmierzona odległość byłaby mniejsza od minimalnej i jednocześnie większa od zera, wtedy zapisujemy ją jako nową minimalną wartość". W moim kodzie wyglądałoby to tak: if (odleglosci[x] < min_odleglosc && odleglosci[x] > 0) min_odleglosc = odleglosci[x]; Niestety, w tym przypadku robot zupełnie nie wykrywałby przeszkód bezpośrednio naprzeciwko niego, bo otrzymywałby tam pomiary 0 cm (rysunek w załącznikach). Czy ktoś wie, jak naprawić kod/elektronikę? Z góry dziękuję za pomoc. Połączenia czujnik - Arduino: Vcc - 5V Gnd - Gnd trig - D8 echo - D7 //w przod - (R_DIR, 1), (L_DIR, 0). Min. predkosc silnikow to 20 w funkcji Left- i Rightmotor. RightMotor - słabszy //w accelerate dodac zczytywanie obecnej v i porownywac z poprzednia v, plynnie zwalniac //tak naprawde wystarcza dwie zmienne: aktualna_odleglosc i max_odleglosc. Jezeli aktualna_odleglosc > max_odleglosc, staje sie max_odleglosc. Jesli nie, w ogole jej nie potrzebujemy #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 #define v_min 20 #define trig 8 #define echo 7 #define SERWO_PIN 11 #include <Servo.h> Servo serwo; float odleglosc; float LeftMotorMargin = 5; int max_odleglosc_global = 0; int min_odleglosc_global = 100; int min_odleglosc = 100; int max_odleglosc = 0; int odleglosci [20]; int powtorzenia = 0; int v_previous = 0; int j, x; int do_usuniecia = 0; int poprzedni_kat_serwa; int czestotliwosc_obrotu_serwa = 18; int int_numer_pomiaru; void LeftMotor (int v)//funkcja sterująca silnikiem lewym z jednym argumentem, prędkością. { if (v>0) //jeżeli podana wartość jest dodatnia { v+=LeftMotorMargin; v = map(v,0,100,0,PWM_MAX);//zmieniamy wartość podaną w programie na PWM digitalWrite (L_DIR, 0);//wyznaczamy kierunek - do przodu analogWrite (L_PWM, v);//PWM równy temu, co wyznaczył uzytkownik } else//jeżeli podana liczba jest ujemna { v = abs(v);//zamieniamy liczbę na dodatnią v+=LeftMotorMargin; //v = v - LeftMotorMargin; v = map(v,0,100,0,PWM_MAX);//zmieniamy podaną wartość na PWM digitalWrite (L_DIR, 1);//wyznaczamy kierunek - do tyłu analogWrite (L_PWM, v);//PWM równy temu, co wyznaczył użytkownik } } void RightMotor (int v)//analogiocznie do lewego silnika { if (v>0) { v = map(v,0,100,0,PWM_MAX); digitalWrite (R_DIR, 1); analogWrite (R_PWM, v); } else { v = abs(v); v = map(v,0,100,0,PWM_MAX); digitalWrite (R_DIR, 0); analogWrite (R_PWM, v); } } void stopMotors()//zatrzymanie silników { analogWrite(L_PWM, 0); analogWrite(R_PWM,0); } void accelerate (int v)//funkcja na płynne przyspieszanie i zwalnianie { if (abs(v)<20)//jeżeli podana liczba jest mniejsza niż 20 { v=20; //prędkość równa się 20 (unikamy prędkości zbyt małych, by ruszyć). } Serial.println (v); if (v>v_previous)//jeżeli przyspieszamy { for (int i = v_previous; i<v; i++)//zacznij od poprzedniej wartości, zwiększaj do wyznaczonej do wyznaczonej { RightMotor(i);//do przodu LeftMotor(i); delay(50); } } if (v<v_previous)//jeżeli zwalniamy { for (int i=v_previous; i>v; i--)//zacznij od wartości poprzedniej, zmniejszaj do wyznaczonej { RightMotor(i); LeftMotor(i); delay(50); } } v_previous = v;//zapisz obecną wartość jako wyznaczoną } float pomiar_odleglosci () { float odleglosc, czas; digitalWrite (trig, LOW); delayMicroseconds (2); digitalWrite (trig, HIGH); delayMicroseconds (10); digitalWrite (trig, LOW); czas = pulseIn (echo, HIGH); odleglosc = czas / 58; return odleglosc; } void serwo_right () { min_odleglosc = 100; for (int i = poprzedni_kat_serwa; i>0; i--) { serwo.write(i); delay(10); //czujnik wychyla sie w prawo, resetujemy min_odleglosc } poprzedni_kat_serwa = serwo.read(); } void serwo_left () { odleglosci[x] = pomiar_odleglosci (); Serial.println ("odleglosc prawa"); Serial.println (x); Serial.println (odleglosci[x]); x++;//wykonujemy pierwszy pomiar (w innym wypadku miałby on miejsce dopiero po wychyleniu serwa o czestotliwosc_obrotu_serwa, czyli 18 stopni) for (int i = poprzedni_kat_serwa; i<=180; i++) { //posuwamy sie az do skrajnie lewego wychylenia (zaczynamy ze skrajnie prawego) if (x>180/czestotliwosc_obrotu_serwa) x=0; //jezeli wykonalismy pelen cykl pomiarow resetujemy ich licznik if (j>=czestotliwosc_obrotu_serwa)//kiedy czujnik skrecil o kat podany jako czestotliwosc_pomiaru (kiedy trzeba wykonac pomiar) { j=0; //resestujemy licznik umozliwiajacy wykonanie pomiaru co czestotliwosc_pomiaru odleglosci[x] = pomiar_odleglosci();//wykonujemy pomiar if (odleglosci[x]>max_odleglosc)//jezeli aktualna odleglosc jest wieksza od zapisanej jako najwieksza odleglosc, staje sie nowa najwieksza odlegloscia max_odleglosc = odleglosci[x]; if (odleglosci[x]<min_odleglosc)//jezeli aktualna odleglosc jest mniejsza od zapisanej jako najmniejsza odleglosc min_odleglosc = odleglosci[x]; if (i < 90)//kiedy czujnik jest wychylony w lewo { Serial.println ("odleglosc prawa");//wypisujemy aktualna odleglosc Serial.println (x); Serial.println (odleglosci[x]); }else //kiedy czujnik jest wychylony w prawo { Serial.println ("odleglosc lewa"); //wypisujemy aktualna odleglosc Serial.println (x); Serial.println (odleglosci[x]); } x++; //zwiekszamy licznik pomiarow } //Serial.print ("Kat serwa = "); opcjonalnie mozna odkomentowac, pozwala zobaczyc kat serwa //Serial.println (serwo.read()); serwo.write(i);//przesuwamy serwo j++;//zmieniamy licznik przesuniec, dzieki temu mozemy robic pomiary kiedy osiognie wartosc = czestotliwosc_pomiaru delay(10); } poprzedni_kat_serwa = serwo.read();//zapisujemy obecny kat obrotu jako poprzedni_kat_serwo, co pomaga w wykonywaniu innych obrotow } void serwo_mid ()//kierujemy serwo do pozycji prostopadlej do tylnej do osi { if (poprzedni_kat_serwa > 90)//jezeli serwo jest zwrocone w lewo { for (int i = poprzedni_kat_serwa; i>90; i--)//zmniejszamy, czyli idziemy do prawej { serwo.write(i); } }else //kiedy serwo jest zwrocone w lewo { for (int i = poprzedni_kat_serwa; i<90; i++)//zwiekszamy, czyli idziemy do lewej { serwo.write(i); } } poprzedni_kat_serwa = serwo.read();//zapisujemy obecny kat obrotu jako poprzedni_kat_serwo, co pomaga w wykonywaniu innych obrotow } void zadany_obrot (int kat)//obrot serwa do zadanego katu { if (poprzedni_kat_serwa > kat)//jezeli zadany kat jest na prawo od obecnego { for (int i = poprzedni_kat_serwa; i>kat; i--)//skrecamy serwo w prawo { serwo.write(i); } }else //jezeli zadany kat jest na lewo od obecnego { for (int i = poprzedni_kat_serwa; i<kat; i++)//skrecamy serwo w lewo { serwo.write(i); } } poprzedni_kat_serwa = serwo.read();//zapisujemy obecny kat obrotu jako poprzedni_kat_serwo, co pomaga w wykonywaniu innych obrotow } int numer_pomiaru ()//zczytujemy tablice odleglosci[] (wyniki pomiarow) i szukamy tego, ktory jest najmniejszy { for (int i = 0; i <180/czestotliwosc_obrotu_serwa; i++)//przeszukujemy wszystkie pomiary { if (odleglosci[i] == min_odleglosc)//jezeli odleglosc o numerze 'i' jest najmniejsza { return i;//zwracamy numer pomiaru } } } float pomiar_odleglosci_serwo()//uzywamy trzech wyzej opisanych funkcji do zrobienia pomiaru odleglosci { serwo_right(); serwo_left(); serwo_mid(); return min_odleglosc; } void setup() { //definicja pinow, start komunikacji pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); pinMode (trig, OUTPUT); pinMode (echo, INPUT); serwo.attach(SERWO_PIN); Serial.begin (9600); serwo_mid(); } void loop() { //wypisywanie wynikow pomiarow w porcie szeregowym Serial.println ("Pomiar odleglosci"); min_odleglosc_global = pomiar_odleglosci_serwo();//sprawdzamy odleglosci od przeszkod wokol robota delay(1000); int_numer_pomiaru = numer_pomiaru();//znajdujemy najmniejszy pomiar Serial.println ("numer pomiaru"); Serial.println (int_numer_pomiaru); Serial.println ("min_odleglosc"); Serial.println (min_odleglosc_global); delay(1000); Serial.println ("zadany obrot"); zadany_obrot(int_numer_pomiaru*czestotliwosc_obrotu_serwa);//obracamy serwo do kata, na ktorym byl najmniejszy pomiar Serial.println ("kat"); Serial.println (int_numer_pomiaru*czestotliwosc_obrotu_serwa); } film z dzialania robota.zip
-
Witam serdecznie wszystkich. Jest to mój pierwszy post na tym forum, po rozpoczęciu Waszego kursu na Forbocie o programowaniu Arduino postanowiłem spróbować swoich sił w napisaniu jakiegoś prostego programu , który chcę wykorzystać przyszłościowo. Napisałem program uwzględniając potrzebne komentarze, jednak po skompilowaniu i wgraniu programu do Arduino Uno, program nie działa według mojego założenia. Poradźcie mi proszę gdzie popełniam błędy i co muszę zmienić abym nie zszedł na zawał🙀😫. Siedzę już trzeci wieczór i dalej klops... Nie mam już pomysłów. Na dzień dzisiejszy program po uruchomieniu załącza przekaźniki w takim samym cyklu, samoczynnie bez wciskania jakiegokolwiek przycisku.. co jest nie tak? Program //test nr1 void setup() { pinMode(6, INPUT_PULLUP);//przełacznik typu krańcówka /test palcem pinMode(8, OUTPUT); //moduł płytki 1 przekażnika załączany stanem wysokim pinMode(9, OUTPUT); //moduł płytki 2 przekażnika załączany stanem wysokim pinMode(7, INPUT_PULLUP); //5V z modułu czujnika digitalWrite(6, LOW); //ustawienie portów po włączeniu zasilania digitalWrite(8, LOW);// ---------------||---------------------- digitalWrite(9, LOW);// ---------------||---------------------- digitalWrite(7, LOW); // ---------------||---------------------- } void loop() { if (digitalRead(6) == HIGH) //jeśli przycisk wciśnięty {digitalWrite(8, HIGH); //Włącz przekaźnik2 delay(1000); //utrzymaj włączony 1 sekundę {digitalWrite(8, LOW); //wyłącz przekaźnik 2 delay(1000);} //odczekaj 1 sekundę {digitalWrite(9, HIGH); //włącz przekaźnik 1 delay(5000);} //utrzymaj włączony 5 sekund }else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty) digitalWrite(9, LOW); //wyłacz przekaźnik 1 digitalWrite(8, LOW);} //wyłacz przekaźnik 2 if (digitalRead(9) == HIGH && digitalRead(7) == HIGH) //Jeśli na pinie 9 jest stan wysoki oraz na wejsciu pin 7 jest stan wysoki to {digitalWrite(9, LOW); //odłącz przekaźnik 1 digitalWrite(8, LOW);} //odłącz przekaźnik 2 else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty, brak stanu wyskoiego pin 7) digitalWrite(9, LOW); //wyłacz przekaźnik 2 digitalWrite(8, LOW); //wyłacz przekaźnik 1 } }
-
Siema wszystkim Potrzebuje pomocy! Wykonałem płytkę #PCB nie dawno z poradnika homemade 102 Poradnik tutaj Gotowa płytka wygoda tak(zdjęcia) Sprawdziłem działa ale tylko z silnikiem 250W a z silnikiem 350W nie działa CO ZROBIĆ ŻEBY 350W DZIAŁAŁAł?? Bateria lito-jonowa #18650 #li-ion 7s6p Komponenty: Transformatory irf3205 Tranzystor S8050 npn Tranzystor S8550 pnp Kondensator 4700uF/50V Kondensator 470uF/50v Rezystor 2, 2K powinna być 2k Rezystor 1K Rezystor 4, 7R Kondensator 104 Dioda 1N4148 Dioda LED Dioda 1N4007 Układ scalony NE555 EAFLE sch i brd.rar
-
Witam wszystkich serdecznie! Jestem całkowicie początkującą osobą jeśli chodzi o Arduino i ostatnio zauważyłem przy bawieniu się potencjometrem, że gdy zostanie podłączony do wyjścia A5, w monitorze portu szeregowego wyświetlana jest inna wartość niż w przypadku podłączenia do wyjścia A0-A4. Ktoś wie z czego to może wynikać? Czy też może to być awaria samego wejścia? Z góry dziękuję za pomoc i pozdrawiam! :)
-
Witam, rozpoczynam naukę elektroniki od zdobywania podstaw i budowy syntezatora modularnego sterowanego napięciem (bardzo fajna baza wiedzy, zwłaszcza podstaw a temat mnie interesuje). Do zasilania musiałem zbudować prosty zasilacz symetryczny +/-12VDC zasilany gniazdkowym zasilaczem transformatorowym. Układ dość gruntownie sprawdziłem przed podłączeniem i mam na nim napięcia +11,7V oraz -12V. Prostowanie jednopołówkowe może się wydawać kiepskim rozwiązaniem jednak jest to dość standardowy projekt do tego zastosowania, na bazie: http://musicfromouterspace.com/index.php?MAINTAB=SYNTHDIY&VPW=1358&VPH=652 Wszystko wydawało się być dobrze jednak mam problem podczas prototypownia pierwszego oscylatora na bazie przerzutnika Schmitta w którym użyłem WO TL074 jako bufor na wyjściu przerzutnika. Kiedy piny zasilające WO są podłączone do masy i +12V wszystko działa dobrze lecz kiedy podłączam go do szyn +/- 12V słyszę tylko zakłócenia. Chcę rozwiązać problem zanim pójdę dalej z układem 1. Coś jest nie tak z moim zasilaniem? 2. Może być to wina samego TL074? Kupiłem je w Chinach i sprawdzałem kilka z podobnym efektem. Pisze głównie z nadzieją, że będzie to oczywiste rozwiązanie jednak jak podejrzewam, wina leży gdzieś po mojej stronie ale już nie mam pomysłu gdzie. Oscylator w obecnej formie (jak rozwiążę obecny problem rozwijam dalej): Na CV jest podawane napięcie 0-5V z klawiatury/sekwencera - układ ma w przyszłości pracowac w standardzie 1V/oktawę. Załączam nagranie różnicy dźwięku podczas zasilania V- na TL074 na masie a potem na -12V. Nagranie może być z tych głośniejszych więc proszę mieć to na uwadze. https://drive.google.com/file/d/1Aj22gcSi09Wipek-1tJJ2HbsDH03-eiC/view?usp=sharing Postarajcie się nie osiwieć przez schematy -pierwszy był pomocniczy w prostym programie którego użyłem do przeniesienia układu zasilania na veroboard a drugi z racji braku czasu nabazgrałem na szybko. Pobrałem KiCAD jednak jakoś brakuje mi czasu, żeby przyzwyczaić się do jego trochę dziwnego workflow.
-
Witam, mam mały problem z sterowaniem serwomechanizmem za pomocą modułów bluetooth HC-05. Wartością wysyłaną jest sygnał z czujnika zginania, jest on zmapowany. Łącząc to na jednym arduino wszystko śmiga jak powinno, czyli odpowiednio zginając czujnik - rusza się serwomechanizm o dany kąt. Problem pojawia się gdy próbuję wysłać ten sygnał za pomocą bluetooth (być może kod jest zły, zaczerpnięty z internetu, ale komuś podobno działało, wstawię niżej). Moje moduły bluetooth zaprogramowałem wydaje mi się prawidłowo, jest między nimi połączenie (lecz musiałem je programować na arduino uno, bo na nano po wpisywaniu komend nic się nie działo). Domyślnie były one na 9600 baud rate. Układ z arduino nano jest moim masterem. Zmapowany sygnał z czujnika zginania wziąłem pod monitor i widać takie wartości: M332 L330 J331 K330 J331 K330 J330 Moim zdaniem powinny być same liczby, a nie jakieś cyferki dodatkowo. (może tu jest problem?) Układ z arduino uno jest slavem i biorąc pod monitor watości dostarczone tutaj otrzymuje: 13 10 83 51 51 51 10 51 Więc jakby liczby są prawidłowe, ale strasznie one skaczą i zginanie czujnika nie skutkuje zmianą tych wartości. Oto kod dla MASTERA: int val1; int state=0; void setup() { Serial.begin(9600); } void loop() { if(Serial.available() > 0){ // Checks whether data is comming from the serial port state = Serial.read(); // Reads the data from the serial por } val1 = analogRead(A0); // reads the value of the potentiometer (value between 0 and 1023) int val1map = map(val1, 0, 400, 0, 180); // scale it to use it with the servo (value between 0 and 180) Serial.println(val1map); Serial.write(val1map); delay(10); } Oto kod dla SLAVE'a: #include <Servo.h> Servo kciuk; // create servo object to control a servo int state=20; void setup() { kciuk.attach(5); // attaches the servo on pins to the servo object Serial.begin(9600); } void loop() { if(Serial.available() > 0){ // Checks whether data is comming from the serial port state = Serial.read(); } kciuk.write(state); Serial.println(state); delay(10); } Może arduino nano jakoś inaczej trzeba łączyć z bluetoothem? Ja oba bluetoothy połączyłem tak: RX z bluetooth'a do TX na arduino, TX z blue do RX na arduino, GND wiadomo do GND na arduino, Vcc do 5V na arduino. Potrzebuje pilnie pomocy i z góry dziękuję za każdą wiadomość!
-
Witam, chcąc połączyć arduino uno, klawiaturę i 5 serwomechanizmów MG996R występują dziwne wariacje niektórych serwomechanizmów (nie zawsze tych samych).Po kilkukrotnym szybkim kliknięciu przycisków, zaczynało wariować. Miałem zaprogramowany przycisk, w którym wszystkie 5 serw pracuje w jednym momencie, wtedy jest największe zapotrzebowanie na prąd i po kilkukrotnej pracy serwomechanizmów, któreś (lub dwa) zawsze zaczynało się kręcić wokół własnej osi, bez końca. Początkowo zasilałem to baterią 9V (poprzez regulator napięcia 5V), wariowały. Stwierdziłem że potrzebny jest większy prąd, to podpiąłem to wszystko pod akumulator od ciągnika (oczywiście przez regulatory 5V), nadal to samo [w załączniku wstawiam zdjęcie połączenia, mam nadzieję że dobrze podłączam, albo tu tkwi problem?]. Potem, aby wyeliminować błędny kod, podpiąłem jedno serwo i potencjometr, na nowym kodzie (prostym) kręcąc potencjometrem, wszystko działało pięknie, lecz po jakichś 2 minutach zaczęło się kręcić w kółko. Nie mam pojęcia co może być przyczyną. Koncepcją główną jest sterowanie serwomechanizmami za pomocą zmiany rezystancji, więc w jednej chwili zazwyczaj będą pracowały wszystkie na raz. Potrzebuję pomocy i z góry dziękuję!
- 14 odpowiedzi
-
- serwomechanizm
- serwo
- (i 3 więcej)
-
Jestem na lekcji 3 z kursu STM32 F1 HAL i próbując pobrać sterowniki z linku podanego w kursie na stronie producenta po kliknięciu w link z maila wyskakuje mi error 403. Miał może ktoś podobny problem? Z Góry dzięki za odpowiedź.
-
Witam wszystkich ,mam problem z drukarka ktory polega na tym ze nie dziala mi auto levelling i nie moge wypoziomowac stolu a dokladniej to ikona na ekranie nie reaguje na dotyk ktos wie od czego to moze byc ?
-
Witam, jestem nowy więc nie wiem czy to dobry dział na forum, ale ten najbardziej był adekwatny. Otóż mam problem z komunikacją Arduino UNO z czujnikiem MPU-6050(GY-521). Głównie problem jest taki, że przy wykorzystywaniu biblioteki pana Jarzębskiego i po odpaleniu serial monitora, wyskakuje błąd: Pomimo iż, podłączyłem zgodnie z poradnikami, czyli VCC do 5V, SCL do SCL(Bądź A5), SDA do SDA(Bądź A4) oraz INT do pinu Digital 2. Ta sama sytuacja następuje przy wykorzystaniu biblioteki Jeffa Rowberga I2Cdev, tak samo próbowałem podpinać i nadal ten sam błąd: Co dziwne, czujnik jest sprawny ponieważ gdy chce wyświetlić surowe dane, to nie ma problemu i mogę je z niego normalnie odczytać.
- 10 odpowiedzi
-
- Arduino Uno
- MPU6050
-
(i 1 więcej)
Tagi:
-
Witam. Od trzech tygodni jestem użytkownikiem maliny 4b. Ostatnio zauważyłem pewien problem i nie wiem jak go rozwiązać. Po podłączeniu do sieci wi-fi mimo że widać że połączenie jest w jakości 3/4 kreski, to po próbowaniu otworzenia jakiejkolwiek strony www, wyświetla się że nie ma internetu lub że strona jest niedostępna. Co mam robić i czy reinstalacja systemu NOOBS, może coś pomóc. Sprawdzałem również ustawienia rutera i spróbowałem zrobić to co potrafiłem. Chciałbym również zaznaczyć że ruter widzi urządzenie. Z góry dziękuję za odpowiedzi, sugestie i rozwiązania.
- 4 odpowiedzi
-
- Raspberry Pi
- Raspberry Pi 4
- (i 2 więcej)
-
Dzień dobry Wszystkim! Tak w skrócie, mój robot ma się poruszać po wyznaczonej ścieżce i robić mapę otoczenia wraz z pokazywaniem swojej pozycji. Mam problem z komunikacją, HC-06 mam podłączony do Arduino Mega 2560 przez RX,TX. Wysyłam dane z czujników optycznych odnośnie pozycji (pozycja już wyliczana w Arduino). Przesyłam 2 zmienne po sobie x1, y1. Arduino łączy się w 1-2 sekundy z moim telefonem, na telefonie używam Serial Bluetooth Terminal i odczyty z Arduino sa odbierane bez problemu (wysyłam około 4-6 danych/sekundę). Podczas łączenia się z komputerem trwa to 30sekund, a czasem 1-2minuty. Po stronie PC mam Bluetootha 4.0 Asusa USB-BT400 (pisze że jest kompatybilny z wersjami 2.0, 2.1, 3.0 no i 4.0... jest BLE (Low Energy). Używam do tego skryptu napisanego w Matlabie. Ta część odpowiada za samo połączenie. Działa gdyż w ustawieniach windowsa w sekcji bluetooth widzę HC-06 i mam sparowane i połączone. delete(instrfind) %zamkniecie otwartych portow w Matlabie clear all instrhwinfo('Bluetooth','HC-06') bt = Bluetooth('HC-06', 1) fopen(bt); Kolejna część kodu zajmuje się odczytem przesyłanych danych i prostym rysowaniem. tic; figure(1); x=0; xn=0; y=0; yn=0; while (true) x=fscanf(bt,'%f'); %odczyt impulsow z lewego kola y=fscanf(bt,'%f'); %odczyt impulsow z prawego kola xn=xn+x; yn=yn+y; plot(xn,yn,'black*') axis auto hold on end Dodam że czasem działa, ale głownie mam błąd z przekroczeniem czasu. Co może być przyczyną że jest taki problem z połączeniem? Poniżej screen z 2 kółek... Dzisiaj udało mi się nawiązać tylko 2 razy połączenie, a z telefonem śmiga. Tylko że na telefonie nie mam takich możliwości z odbieraniem danych i rysowaniem ich. A może jest jakaś apka na androida co by mi rysowała położenie mojego robota? Na koniec kod z Arduino. Trzymanie się lini i sterowanie silnikami wykonuje na niezależnym Arduino Nano. Próbowałem wykonywać i śledzenie linii, PID'a i odczyt z enkoderów, a także obsługę 3 czujników HC-SR04 na jednej platformie Arduino MEga2560, ale nie ogarniał (a może to mój nie zoptymalizowany kod?). Robiłem to przerwaniach, wątkach itd. Stanęło na 2 Arduino jak teraz, choć zastanawiam się nad platformą ESP32, nie wiem czy by nie było łatwiej. Proszę o pomoc. //czujniki lini #define L2_LINE_SENSOR A0 #define R2_LINE_SENSOR A1 //czujniki szczelinowe #define L_SZCZ 2 #define P_SZCZ 3 //silniki #define LMOTOR 9 #define RMOTOR 8 #define IN1 4 #define IN2 5 #define IN3 6 #define IN4 7 //czujniki ultradzwiekowe #define SechoHSCR04 51 #define StrigHSCR04 49 #define PechoHSCR04 50 #define PtrigHSCR04 48 #define LechoHSCR04 42 #define LtrigHSCR04 40 #include <Stream.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(17, 16); // RX, TX #include <Wire.h> #include <Timers.h>//watki Timers<1>akcja;//watki volatile float impL=0, impP=0, vx1=0, vy1=0; //"impL","impP"-impulsy z enkoderow; float x1=0, y1=0, r=3.25, teta=0, tetaKat=0, tetaV=0, d=6.5, l=0, L=13.30, dystansL=0, dystansP=0, dystansS=0; //"r"-promien kola; "L"-odleglosc pomiedzy kolami mierzona od osi kola int licznik=0; int blad=0, g=200, vstart=40, pochodna=0, poprzedni=0, calka=0, PID=0; //"g"-granica widzialnosci czarnej lini; "vstart"-predkosc stala float Kp=8, Kd=0.1, Ki=0.4; //nastawy regulatora PID float Ldystans=0, Sdystans=0, Pdystans=0; float doMetra=0, prawo90=0; unsigned long s=0, start=0, time=0, aktualnyCzas=0, zapamietanyCzas=0, roznicaCzasu=0;//timery String inString = ""; void setup() { //Zasilanie +++ pinMode (47, OUTPUT);//ultradzwiekowy srodek digitalWrite(47, HIGH); pinMode (46, OUTPUT);//ultradzwiekowy prawy digitalWrite(46, HIGH); pinMode (38, OUTPUT);//ultradzwiekowy lewy digitalWrite(38, HIGH); pinMode (22, OUTPUT);//szczelinowy prawy digitalWrite(22, HIGH); pinMode (23, OUTPUT);//szczelinowy lewy digitalWrite(23, HIGH); //Masa --- pinMode (53, OUTPUT);//ultradzwiekowy srodek digitalWrite(53, LOW); pinMode (52, OUTPUT);//ultradzwiekowy prawy digitalWrite(52, LOW); pinMode (44, OUTPUT);//ultradzwiekowy lewy digitalWrite(44, LOW); //--------------Czujniki optyczne pinMode(L_SZCZ, INPUT); pinMode(P_SZCZ, INPUT); l=d*PI; //Silniki pinMode (LMOTOR, OUTPUT);//lewy pinMode (IN1, OUTPUT);//przod pinMode (IN2, OUTPUT);//tyl pinMode (RMOTOR, OUTPUT);//prawy pinMode (IN3, OUTPUT);//przod pinMode (IN4, OUTPUT);//tyl analogWrite(LMOTOR, 0); //Ustawienie predkosci digitalWrite(IN1, HIGH); //Kierunek: do przodu digitalWrite(IN2, LOW); //Kierunek: do tylu analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN3, HIGH); //Kierunek: do przodu digitalWrite(IN4, LOW); //Kierunek: do tylu //Czujniki odbiciowe pinMode(R2_LINE_SENSOR, INPUT); pinMode(L2_LINE_SENSOR, INPUT); //Czujniki ultradzwiekowe pinMode(SechoHSCR04, INPUT); pinMode(StrigHSCR04, OUTPUT); pinMode(LechoHSCR04, INPUT); pinMode(LtrigHSCR04, OUTPUT); pinMode(PechoHSCR04, INPUT); pinMode(PtrigHSCR04, OUTPUT); mySerial.begin(9600); Serial.begin(9600); s=millis(); start=millis(); time = millis(); //------------Watki------------ //akcja.attach(0, 50, wysylanie); akcja.attach(0, 250, pozycja); //akcja.attach(1, 980, hcsr04lewy); //akcja.attach(2, 990, hcsr04srodek); //akcja.attach(3, 1000, hcsr04prawy); //akcja.attach(4, 2000, stopMotors); //--------------Przerwania na enkoderach kol--------------------- attachInterrupt(digitalPinToInterrupt(2), enkoderL, LOW); attachInterrupt(digitalPinToInterrupt(3), enkoderP, LOW); } //******************************************** //*****************FUNKCJE******************** //******************************************** //-----------------Wysylanie pozycji z arduinoNano przez BT void wysylanie() { if (Serial.available() > 0) { int inChar = Serial.read(); if (inChar != '\n') { inString += (char)inChar; } else { Serial.println(inString.toFloat()); inString = ""; } } } //----------------Enkodery kol void enkoderL() { if ((millis() - time) > 5) impL++; time = millis(); } void enkoderP() { if ((millis() - time) > 5) impP++; time = millis(); } //----------------Pozycja pojazdu void pozycja() { //droga przejechana przez kazde z kol dystansL=(impL/20)*l; dystansP=(impP/20)*l; //kata o jaki obrocil sie robot tetaKat=tetaKat+((dystansP-dystansL)/L); //pozycja dystansS=(dystansP+dystansL)/2; x1=dystansS*(cos(tetaKat)); y1=dystansS*(sin(tetaKat)); //Serial.print("x1: "); mySerial.println(x1); //Serial.print("y1: "); mySerial.println(y1); //reset licznikow impL=0; impP=0; } //---------------Jazda prosto 1 metr void jedenMetr () { if (doMetra<100) { dystansL=(impL/20)*l; dystansP=(impP/20)*l; dystansS=(dystansP+dystansL)/2; analogWrite(RMOTOR, 70); //Ustawienie predkosci digitalWrite(IN3, HIGH); //Kierunek: do przodu analogWrite(LMOTOR, 70); //Ustawienie predkosci digitalWrite(IN1, HIGH); //Kierunek: do przodu doMetra=dystansS+doMetra; //reset licznikow impL=0; impP=0; Serial.println(doMetra); } else if (doMetra>=100) { analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN3, LOW); //Kierunek: do przodu analogWrite(LMOTOR, 0); //Ustawienie predkosci digitalWrite(IN1, LOW); //Kierunek: do przodu } } //---------------Skręt w prawo 90 stopni void wPrawo90 () { if (prawo90<20.88) { dystansL=(impL/20)*l; analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN3, LOW); //Kierunek: do przodu analogWrite(LMOTOR, 70); //Ustawienie predkosci digitalWrite(IN1, HIGH); //Kierunek: do przodu prawo90=dystansL+prawo90; //reset licznikow impL=0; impP=0; Serial.println(prawo90); } else if (prawo90>=20.88) { analogWrite(LMOTOR, 0); //Ustawienie predkosci analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN1, LOW); digitalWrite(IN3, LOW); } } //---------------Pomiar odleglosci czujnika srodkowego void hcsr04srodek () { float czas; digitalWrite(StrigHSCR04, LOW); delayMicroseconds(2); digitalWrite(StrigHSCR04, HIGH); delayMicroseconds(10); digitalWrite(StrigHSCR04, LOW); czas = pulseIn(SechoHSCR04, HIGH); Sdystans = (czas / 58); //delay(1000); //Serial.print("\nOdleglosc-srodek: "); mySerial.println(Sdystans); } //---------------Pomiar odleglosci czujnika lewego void hcsr04lewy () { float czas; digitalWrite(LtrigHSCR04, LOW); delayMicroseconds(2); digitalWrite(LtrigHSCR04, HIGH); delayMicroseconds(10); digitalWrite(LtrigHSCR04, LOW); czas = pulseIn(LechoHSCR04, HIGH); Ldystans = (czas / 58); //delay(1000); //Serial.print("\nOdleglosc-lewy: "); mySerial.println(Ldystans); } //---------------Pomiar odleglosci czujnika prawego void hcsr04prawy () { float czas; digitalWrite(PtrigHSCR04, LOW); delayMicroseconds(2); digitalWrite(PtrigHSCR04, HIGH); delayMicroseconds(10); digitalWrite(PtrigHSCR04, LOW); czas = pulseIn(PechoHSCR04, HIGH); Pdystans = (czas / 58); //delay(1000); //Serial.print("\nOdleglosc-prawy: "); mySerial.println(Pdystans); } //---------------------Wyliczenie bledu int error () { if (analogRead(L2_LINE_SENSOR) < g && analogRead(R2_LINE_SENSOR) < g) { //nie widza lini blad=1; } else if (analogRead(L2_LINE_SENSOR) > g && analogRead(R2_LINE_SENSOR) < g) { //lewy widzi linie blad=2; } else if (analogRead(L2_LINE_SENSOR) < g && analogRead(R2_LINE_SENSOR) > g) { //prawy widzi linie blad=-2; } //Serial.print("blad: "); //Serial.println(blad); return blad; } //-----------------------------PID void regPID () { pochodna=blad-poprzedni; poprzedni=blad-poprzedni; calka=constrain(calka+blad, -50, 50); PID=round(abs((Kp*blad)+(Kd*pochodna)+(Ki*calka))); //Serial.print("PID: "); //Serial.println(PID); if (blad == 1) {//jazda prosto leftMotor(vstart); rightMotor(vstart); } else if (blad == 2) { //lewy widzi linie leftMotor(vstart-PID); rightMotor(vstart+PID); } else if (blad == -2) { //prawy widzi linie leftMotor(vstart+PID); rightMotor(vstart-PID); } } //-------------------Sterowanie silnikami void leftMotor(int V) { if (V>0) { //V=constrain(V, 0, 256); analogWrite(LMOTOR, V); //Ustawienie predkosci digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); } else { //stop //V=abs(V); analogWrite(LMOTOR, 0); //Ustawienie predkosci digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); } } void rightMotor(int V) { if (V>0) { //V=constrain(V, 0, 256); analogWrite(RMOTOR, V); //Ustawienie predkosci digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } else { //stop //V=abs(V); analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } } void stopMotors() { analogWrite(LMOTOR, 0); //Ustawienie predkosci analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(1000); } //--------------PETLA GLOWNA-------------- void loop() { //jedenMetr(); //wPrawo90(); //akcja.process(); //aktualnyCzas = millis(); //roznicaCzasu = aktualnyCzas - zapamietanyCzas; //error(); //regPID(); delay(200); pozycja(); //if (roznicaCzasu >= 250UL) { //zapamietanyCzas = aktualnyCzas; //pozycja(); //hcsr04lewy(); //hcsr04srodek(); //hcsr04prawy(); //} /* float czas=millis(); Serial.println(analogRead(R2_LINE_SENSOR)); delay(1000); Serial.print(" , "); Serial.println(czas/1000); */ }
-
STM32 Problem z zadaniem 4.1 kursu stm32 F1 HAL (lekcja #4)
Lay-Z opublikował temat w Mikrokontrolery
Hej, próbuję przerobić kurs STM32 F1 HAL i na samym początku pojawiły się problemy, a mianowicie od kilku dni próbuję zrobić zadanie 4.1, jednak wszystkie próby kończą się niepowodzeniem. Ma może ktoś zrobione to zadanie i chciałby się nim podzielić oraz sposobem jego rozwiązania? Poniżej mój kod. Z góry dziękuję! #include "stm32f1xx.h" int main(void) { SystemCoreClock = 8000000; // taktowanie 8Mhz HAL_Init(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitTypeDef gpio; // obiekt gpio będący konfiguracją portów GPIO gpio.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4| GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9; gpio.Mode = GPIO_MODE_IT_RISING; gpio.Pull = GPIO_PULLUP; // rezystory podciągające są wyłączone gpio.Speed = GPIO_SPEED_FREQ_LOW; // wystarczą nieskie częstotliwości przełączania HAL_GPIO_Init(GPIOC, &gpio); // inicjalizacja modułu GPIOC gpio.Pin = GPIO_PIN_13; // konfigurujemy pin 13 gpio.Mode = GPIO_MODE_INPUT; // jako wejście gpio.Pull = GPIO_PULLUP; // włączamy rezystor podciągający HAL_GPIO_Init(GPIOC, &gpio); // port GPIOC while (1) { if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET) { uint32_t led = 0; HAL_GPIO_WritePin(GPIOC, 1 << led, GPIO_PIN_SET); //włącz diode HAL_Delay(150); HAL_GPIO_WritePin(GPIOC, 1 << led, GPIO_PIN_RESET); //wyłącz diode if (++led >= 10) { // przejdz do nastepnej led = 0; } else { uint32_t led = 10; HAL_GPIO_WritePin(GPIOC, 1 << led, GPIO_PIN_SET); //włącz diode HAL_Delay(150); HAL_GPIO_WritePin(GPIOC, 1 << led, GPIO_PIN_RESET); //wyłącz diode if (--led >= 10) { // przejdz do nastepnej led = 10; } } } } }- 9 odpowiedzi
-
- Kurs STM32
- zadanie4.1
-
(i 1 więcej)
Tagi:
-
Witam, skończyłem podstawy elektroniki część pierwsza, teraz miałem zamiar nauczyć się podstaw Pythona i zacząć z kursem Raspberry Pi (dodam tylko, że wcześniej programowałem ok. 4 miesiące w C++ i skończyłem kursy pana Mirosława Zelenta) lecz natrafiłem na pewien problem, który ogranicza możliwość dalszego rozwijania się, problem ten związany jest z wybieraniem Interpretera mianowicie w momencie kiedy ręcznie dodaję interpreter wyskakuje mi błąd "Permission denied". Proszę o pomoc, ponieważ nie chciałbym, żeby jakieś środowisko pracy stanowiło dla mnie przeszkodę w rozwijaniu się. (Dodam również, że mam 16 lat i jestem bardzo zmobilizowany do nauki programowania). Z góry dziękuje za wszelką pomoc. Poniżej zamieszczam screeny:
- 3 odpowiedzi
-
- problem z kodem
- problem
- (i 2 więcej)
-
Witajcie! Od niedawna mam przyjemność uczenia się z kursu Elektronika 1 z fenomenalnym zestawem do tego 😄 i jestem pod takim wrażeniem że aż pojawił się mały problem. Ale od początku... trafiłem tu przez chęć kupienia Maliny. Chciałem najpierw kupić z oficjalnej strony przez Botland RPi z dodatkami (klawiatura mysz itp.) i to nawet w podobnej cenie co ten zestaw z FORBOT. Doszedłem do wniosku jednak że lepiej kupić pakiet FORBOTA bo tak przynajmniej się czegoś nauczę, i nie wydam pieniędzy w błoto a co ważniejsze nie zepsuje maliny przez własną niewiedzę. Więc zacząłem wczytywać się w kurs elektroniki i dosłownie po pierwszej lekcji kursu zamówiłem zestaw do elektroniki kurs 1. Aktualnie będę zaczynał lekcję numer 5. I zacząłem zastanawiać się nad kolejnymi kursami i powiem szczerze że nie mam pojęcia do czego przejść dalej. 1. RPi kusi, ale cenowo jest dla mnie wysoko (studiuję i nie pracuję aktualnie + brak czasu na prace przez praktyki) no i musiał bym chwilę odkładać. 2. Kurs elektroniki brzmi zachęcająco ale w sumie jest w tym drugim dziale dla zaawansowanych bardziej więc też tu sprawa nie jest prosta. 3. Kurs Arduino 1 - zaczynam się nad tym zastanawiać ale nie wiem. Z jednej strony jest tam C a mi bliżej do języków skryptowych więc z mojej wiedzy to bardzie RPi z pythonem. Ale z drugiej strony mam do napisania projekty 3 w c/c++ na studia plus minus do grudnia i mogło by mnie to zmotywować do nauki języka. (Szybkie pytanie czy w Arduino można pisać w C++ czy tylko C?) 4. Kurs lutowania, gdzie nigdy na oczy nie widziałem lutownicy na żywo może raz i raz miałem w ręce ale nie lutowałem nigdy. Też kuszące ale poziom skomplikowania wydaje się być duży. 5. Kurs techniki cyfrowej... nie wiem czy nawet można się za to brać po pierwszym kursie elektroniki i czy drugiego nie potrzeba ale też brzmi kusząco. Plan jest taki że mam zamiar przejść przez wszystkie (prosił bym o jakieś informacje odnośnie kurs micro:bit bo ten mnie najmniej z własnego opisu przekonał, do czego może mi się to przydać?) Prosiłbym o scharakteryzowanie kursów które wypisałem wyżej i jeśli ktoś chce to może ustawić plan w jakiej kolejności je realizować po tym pierwszym z elektroniki. Oraz podać zalety takiego play i ewentualnie wady. Był bym bardzo wdzięczny! Pozdrawiam Ruby