Skocz do zawartości

Mialek

Użytkownicy
  • Zawartość

    16
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O Mialek

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  • Zainteresowania
    Adruino,Raspberry
  • Zawód
    tech.elektryk, tech. Agrobiznes
  1. Witam, zbudowałem optyczny sortownik kolorów. Segregacja ma się odbywać w locie. Użyłem dwóch kamer ELP 120fps 640x360. Program w Python z opencv, i sterowanie za pomocą arduino.(elektromagnes steruje klapką) Niestety kamery wydają się być zbyt wolne, zastanawiam się nad zakupem kamer ELP 330fps 640x360. Czy dobrze kombinuję ?
  2. Dzięki dzięki dzięki Wielkie, właśnie tego już dłuższy czas szukam.
  3. Dzięki za odpowiedź Kamera jest sztywno nad taśmociągiem i nic się nie zmieni, przekręci. Jak podzielić na sztywno obraz? Np. żeby pokazać każdy pasek w oddzielnym oknie ?
  4. Witam. mam taki kod, do uzyskiwania video, jak nałożyć białą maskę żeby tylko widzieć to co jest w niebieskiej ramce import cv2 cap = cv2.VideoCapture(0) cap.set(3,640) cap.set(4,380) while(1): _, frame = cap.read() cut = cv2,rectangle(frame, (220, 200), (450, 400), (255,0,0), 2) cv2.imshow('cut', cut) k = cv2.waitKey(5) & 0xFF if k == 27: break cv2.destroyAllWindows() Wielkie dzięki, pewnie dla was banalne, ja nie mogę znaleźć odpowiedzi.
  5. Dzięki za odpowiedzi, fajnie że jest ktoś chętny do pomocy Udało mi się to co chciałem, dokładnie: gdy jest 5 jedynek pod rząd, serwo na 20 stopni, gdy jest 5 zer pod rząd, serwo na 100 stopni. Działający kod jak by ktoś miał ten sam problem: #include <Servo.h> Servo myservo; String dane = ""; int liczba = 0; int liczba0 = 0; void setup() { // put your setup code here, to run once: Serial.begin(9600); //Uruchomienie komunikacji myservo.attach(3); } void loop() { if(Serial.available() > 0) { dane = Serial.readStringUntil('\n'); if(dane == "1") { liczba0 = 0; Serial.print("liczba "); Serial.println(liczba); liczba = liczba + 1; } if(dane == "0") { liczba = 0; Serial.print("liczba0 "); Serial.println(liczba0); liczba0 = liczba0 + 1; } } if(liczba == 5) { myservo.write(20); liczba = 0; } if(liczba0 == 5) { myservo.write(100); liczba0 = 0; } } Czekam, na kamerki USB z aliexpress, mają mieć w mniejszej rozdzielczości aż 120fps, dodatkowo, z oprogramowania dostęp do ustawień kamery, takich jak przysłona i kilka innych wpływające na rozróżnianie kolorów. Co do fps, to chciałbym wycisnąć jak najszybciej, nawet spróbuję w locie wykrywać, jak przyjdą mi kamerki, chciałbym osiągnąć chociaż 100kg/godz. Projekt sortownika wykonałem za pomocą desingSparka i drukarki 3D, działa ciekawie. Gdy dostanę kamerki, zamontuję ustawię program, zobaczę co się będzie dziać, i na pewno się tym podzielę. Ethank widzę że ogarniasz Python, może chciałbyś coś pomóc, tak jak piszesz, dodać linijki kodu który poprawi pracę serwa, a nawet samego wykrywania, chcę dodać na kamerę kilka rzędów nasion, tylko trzeba ogarnąć żeby wykrywało w jakby podzielonym ekranie na paski, tzn. rząd pierwszy wykrycie, rząd trzeci wykrycie. itd. Oczywiście szanujemy siebie i swój czas, więc jestem w stanie zapłacić. Pozdrawiam
  6. Dzięki za odpowiedź. Hehe, tak, mogą być po kolei dwa złe, czy też dobre, gdzie w tym przypadku będzie 90% dobrych a 10% złych. Program do wykrywania, jak napisałem, skleiłem z różnych gotowych źródeł z github, i ciężko mi cokolwiek edytować bo się na tym za bardzo nie znam Metodą prób i błędów udało mi się wszystko skleić. Oczywiście że lepiej żeby ubuntu dawało sygnał o ruchu, tylko nie potrafię tego zrobić Udało mi się dodać wysyłanie do arduino danych, klatka po klatce, i do arduino jest więcej poradników i gotowych rozwiązań, więc zdecydowałem że będzie mi łatwiej na nim to ogarnąć ale jak widać idzie średnio
  7. Dzięki za odpowiedzi Tworzę sortownik, mam komputer z ubuntu i bibliotekami przetwarzania obrazu. Skleiłem program który wykrywa złe nasiona. Czyli: Mam podpiętą kamerkę usb która patrzy na taśmociąg, program do arduino po porcie wysyła co klatkę(ok. 30 klatek/s) Zero - jeźeli nie ma nic lub leci dobre. Jedynkę - gdy na danej klatce wykryje złe nasionko. Za kamerą jest servo które ma za zadanie przesunąć ziarno. Więc zadaniem arduino jest ruch serwa po serii jedynek, gdy zaczną się zera. 000000000000001111111111111111111111111110000000000000000001111111111111111111111000000000000000000000 l_________________l_________________________________l______________________l___________________________l__________________________l l l l l l brak złe nasiono brak złe nasiono brak, lub dobre. Czasami gdy leci dobre złapie jako złe przez jedną lub dwie klatki, tak samo gdy leci złe, zrobi lekką przerwę, przykad: 00000001000000000001111111111111110101111111111110000000000000000000111111111111011111111111000000000000000000 W tej sytuacji może inne rozwiązanie będzie lepsze? Dzięki za pomoc !!!
  8. Witam wszystkich Mam arduino UNO do którego przesyłam dane za pomocą portu szeregowego. Dane wyglądają następująco(przykład): 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,1,1,1,11,11, Dane są z jedynek i zer, wysyłane są od nowej Lini. Po serii jedynek, jak zaczną się zera(nie jedno, minimum np.5) serwo ma wykonać ruch, znów po serii jedynek np. 5 jedynkach pod rząd, i pieciu zerach, wykonaj ruch. Stworzyłem taki kod, ale nie działa za dobrze, jak zapisywać do zmiennych po kolei dane z portu szeregowego ? np. 10 zmiennych które mają się zapisywać jak pętla? #include <Servo.h> Servo myservo; String odebraneDane = ""; //Pusty ciąg odebranych danych String l1 = ""; String l2 = ""; String l3 = ""; String l4 = ""; String l5 = ""; String l6 = ""; String l7 = ""; void setup() { Serial.begin(9600); //Uruchomienie komunikacji myservo.attach(3); } void loop() { myservo.write(20); if(Serial.available() > 0) { odebraneDane = Serial.readStringUntil('\n'); Serial.println("dane" + odebraneDane); } if(odebraneDane == "1" && Serial.available() > 0) { l1 = Serial.readStringUntil('\n'); Serial.println("l1 " + l1); } if(odebraneDane == "1" && l1 == "1" && Serial.available() > 0) { l2 = Serial.readStringUntil('\n'); Serial.println("l2 " + l2); } if(odebraneDane == "1" && l1 == "1" && l2 == "1" && Serial.available() > 0) { l3 = Serial.readStringUntil('\n'); Serial.println("l3 " + l3); } if(odebraneDane == "1" && l1 == "1" && l2 == "1" && l3 == "1" && Serial.available() > 0) { l4 = Serial.readStringUntil('\n'); Serial.println("l4 " + l4); } if(odebraneDane == "1" && l1 == "1" && l2 == "1" && l3 == "1" && l4 == "1" && Serial.available() > 0) { l5 = Serial.readStringUntil('\n'); Serial.println("l5 " + l5); } } Przepraszam, troszkę ciężko mi to wytłumaczyć co chcę osiągnąć, pytajcie. Dzięki
  9. Dziękiii udało się, przy takiej niby pierdołce przesiedziałem z 3-4h ;D teraz takie pytanko, dlaczego nie chciało mi działać na takim kodzie : if (abs(sensors.readTemperature(address) - temperatura_ustawiona)<2); { myservo.write(trzymaj); } if (abs(temperatura_ustawiona+3)<sensors.readTemperature(address)); { myservo.write(zamknij); } if (abs(temperatura_ustawiona-3)>sensors.readTemperature(address)); { myservo.write(otworz); } a jak zrobiłem tak: mniej = temperatura_ustawiona -3; wiecej = temperatura_ustawiona +3; wynik = (abs(sensors.readTemperature(address) - temperatura_ustawiona)); if (abs(wynik<2)) { myservo.write(trzymaj); } if (abs(sensors.readTemperature(address)>wiecej)) { myservo.write(zamknij); } if (abs(sensors.readTemperature(address)<mniej)) { myservo.write(otworz); } to działa, przecież to jest to samo chyba jeszcze jedno pytanko, czy jest możliwość żeby arduino wysyłało na któryś PWM informację o temperaturze pieca którą odbierze ESP8266 i prześle mi do domoticza ? fajnie by było jak by wysłał jeszcze info o ustawionej temperaturze i stanie serwa, ale czy tyle danych przesle przez jeden PWM ? jak to skomplikowane to już wolę oddzielny ds18b20 podpiac pod esp i normalnie wysłać temp. Dzięki za pomoc, Ogarnę kod opiszę i wstawię, teraz czas na browarka
  10. Dzięki, tylko troszkę ciężko było mi ten kod zrozumieć, ale znalazłem na internecie fajnie wytłumaczone Źródło: http://akademia.nettigo.pl kod: // Program odczytuje temperaturę z czujnika #include <OneWire.h> #include <DS18B20.h> // Numer pinu do którego podłaczasz czujnik #define ONEWIRE_PIN 2 // Adres czujnika byte address[8] = {0x28, 0xB1, 0x6D, 0xA1, 0x3, 0x0, 0x0, 0x11}; OneWire onewire(ONEWIRE_PIN); DS18B20 sensors(&onewire); void setup() { while(!Serial); Serial.begin(9600); sensors.begin(); sensors.request(address); } void loop() { if (sensors.available()) { float temperature = sensors.readTemperature(address); Serial.print(temperature); Serial.println(F(" 'C")); sensors.request(address); } // tu umieść resztę twojego programu // Będzie działał bez blokowania } Wrzucam dla potomnych gdyby mieli ten sam problem teraz postaram się to układać, jak zadziała to się podzielę kodem, jak nie, to dalej będę prosił o pomoc, jeszcze raz dzięki ethanak za pokazanie kierunku, z kazdą godziną coś się uczę #####EDIT##### No i mam problem program działa fajnie, lecz problem z ustawieniem warunków, if (abs(sensors.readTemperature(address) - temperatura_ustawiona)>2) { myservo.write(srodek); } dany kod ustawia serwo na srodek jak temperatura pieca jest +-2 stopnie od temperatury ustawionej ale nie mogę zrobić że jak mamy np. ustawione 50* a temp jest ponizej 48* to serwo.write(otworz); a jak powyzej 52* to serwo.write(zamknij); pokierujcie :->
  11. A może coś związane z tematem... bo już się 2 stronę przekrzykujecie, a ja chcę się coś nauczyć
  12. Dzięki za zainteresowanie kolega es2 napisał że : "Jedyne co mogłoby blokować program " while ((temperatura_pieca) =temperatura_ustawiona); ale jak widac w programie przed while jest // komentarz więc ta linijka nie działa, hmm, sterownika pieca nie ruszam, posiadam piec miałowy/drewno, w którym jest dmuchawa, pompa, (sterowane sterownikiem pieca) lecz zauważyliśmy z ojcem że na dmuchawie o wiele szybciej wypala drewno niż gdy wyłączymy dmuchawę(wyjęta wtyczka) i się lekko uchyli drzwiczki, lecz gdy się rozpala drzwiczki muszą być otwarte na max a gdy osiągnie ok 50 stopni to je się przymyka, gdy się dorzuci drewna i piec zaczyna bujać to jeszcze bardziej trzeba przymknąć, lecz jak to ludzie mają, zapominają, i juz kilkanascie razy wywaliło wodę z zbiornika wyrównawczego, dlatego chciałbym postawić program na arduino mini podłączyć czujnik temp. wody pieca, i servo od klapki pieca, gdy nacisnę przycisk(rozpalanie) to ma otworzyć na 100% drzwiczki, gdy złapie już 50-55 stopi przymknąć na 50%, a gdy osiągnie temperaturę ustawioną(przyciskami) czyli ok 60 stopni, przymkną na np. 20% jak dalej rośnie to -5%, jak spada to +5%, myślę że taki program nie jest jakoś mocno skomplikowany, oczywiście gdy zrobię program to będzie pierwsze testowany, i przy piecu będzie się co chwilę zobaczyć co się dzieje. dodatkowa opcja jaką chcę dodać gdy bedzie działać to dołożyć esp8266 który będzie wysyłać do domoticza(mam raspberry jako centrala) temperaturę na piecu, i boliera z wodą, na domoticzu ustawię alarm żeby przychodziły wiadomości o za dużej temperaturze, jak i mogę sprawdzić będąc na polu lub gdzieś indziej jaka jest temp. ale to już później Co do tematu, czy dobrze to piszę co chcę osiągnąć ? Jak mam napisany program od przycisków to mogę go przywołać #include "przyciski" i odbierać jedynie to co jest ustawione czyli temperaturę ustawioną, ?? jak możecie to wytłumaczcie swoje argumenty, tylko tak na chłopski rozum bo jeszcze za bardzo nie czaję tych fachowych zagadnień. prowadzę gospodarstwo i chcę w wielu miejscach użyć arduino żeby zrobił to program, przez co zyskam czas na zrobienie czegoś innego.
  13. Dokładnie tak, nie wiem jak to naprawic
  14. Dzięki za odpowiedź, o co chodzi z tym watchdogiem ? dobra ogarnełem trochę kod, ale dalej mi nie chce działać ;/ zrobiłem taki kod gdzie przyciski idealnie działają po wgraniu na płytkę #include "ClickButton.h" //przywołaj bibloteke clickbutton.h unsigned long aktualnyCzas = 0; //pamięć unsigned long zapamietanyCzas = 0; // przycisk pin const int buttonPin2 = 4; // buttonpin2 jako 4 pin const int buttonPin1 = 2; //buttonpin1 jako 2 pin ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP); //wyjście z opornikiem wew. jako przycisk z masa ClickButton button2(buttonPin2, LOW, CLICKBTN_PULLUP); int temperatura = 0; //pamięć void setup() { Serial.begin(9600); // czas przycisniecia przycisku (wszystkie w milisekundach / ms) // (są to wartości domyślne ustawione, można je zmienić dla wygody) button1.debounceTime = 20; // Timer odbicia w ms button1.multiclickTime = 250; // Limit czasu dla wielu kliknięćclicks button1.longClickTime = 1000; // czas, aż zarejestrują się "kliknięcia zatrzymane" } void loop() { button1.Update(); // Zaktualizuj stan przycisku aktualnyCzas = millis(); // aktualny czas jako milis button2.Update(); // jeśli (przycisk== nacisniety) temperatura ++/-- if(button2.clicks == 1) temperatura--; if(button1.clicks == 1) temperatura++; //problem \|/ if(button2.clicks == 2) (temperatura-2); // nie dziala if(button1.clicks == 2) (temperatura+2); //nie dziala //wyślij temperatura if ((aktualnyCzas - zapamietanyCzas >=200UL) && (button1.clicks == 1)) // jesli czas mina 1s i wcisnieto button 1 to: { zapamietanyCzas = aktualnyCzas; // zapamietany czas to aktualny czas Serial.println(temperatura); // wyslij do komputera temperaturę po nacisnieciu przycisku } if ((aktualnyCzas - zapamietanyCzas >=200UL) && (button2.clicks == 1)) // jesli czas mina 1s i wcisnieto button 1 to: { zapamietanyCzas = aktualnyCzas; Serial.println(temperatura); } } ale gdy dodam sterowanie pieca juz lipka #include <OneWire.h> #include <DallasTemperature.h> #include <Servo.h> #include "ClickButton.h" //przywołaj bibloteke clickbutton.h Servo myservo; byte pozycja = 0; //pozycja serva int pozycjaPoprzednia = 0; int temperatura_pieca = 0; // pamiec temperatury pieca int temperatura_ustawiona = 0; // pamiec temperatury ustawionej unsigned long aktualnyCzas = 0; //pamięć przycisku unsigned long zapamietanyCzas = 0; const int buttonPin2 = 4; // buttonpin2 jako 4 pin const int buttonPin1 = 2; //buttonpin1 jako 2 pin ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP); //wyjście z opornikiem wew. jako przycisk z masa ClickButton button2(buttonPin2, LOW, CLICKBTN_PULLUP); OneWire oneWire(A5); //Podłączenie do A5 DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki void setup() { myservo.attach(11); Serial.begin(9600); sensors.begin(); //Inicjalizacja czujnikow // czas przycisniecia przycisku (wszystkie w milisekundach / ms) // (są to wartości domyślne ustawione, można je zmienić dla wygody) button1.debounceTime = 20; // Timer odbicia w ms } void loop() { sensors.requestTemperatures(); //Pobranie temperatury czujnika int temperatura_pieca = sensors.getTempCByIndex(0); //temperatura pieca jako sensor temper. // pozycja = map(odczytCzujnika, 0, 80, 40, 100); button1.Update(); // Zaktualizuj stan przycisku aktualnyCzas = millis(); // aktualny czas jako milis button2.Update(); // jeśli (przycisk== nacisniety) temperatura ++/-- if(button2.clicks == 1) temperatura_ustawiona--; if(button1.clicks == 1) temperatura_ustawiona++; // if (aktualnyCzas - zapamietanyCzas >=3000UL) { // Serial.print("Aktualna temperatura: "); // Serial.println(sensors.getTempCByIndex(0)); //Wyswietlenie informacji // } if ((aktualnyCzas - zapamietanyCzas >=200UL) && (button1.clicks == 1)) // jesli czas mina 1s i wcisnieto button 1 to: { zapamietanyCzas = aktualnyCzas; // zapamietany czas to aktualny czas Serial.println(temperatura_ustawiona); // wyslij do komputera temperaturę po nacisnieciu przycisku } if ((aktualnyCzas - zapamietanyCzas >=200UL) && (button2.clicks == 1)) // jesli czas mina 1s i wcisnieto button 1 to: { zapamietanyCzas = aktualnyCzas; Serial.println(temperatura_ustawiona); } // jesli temperatura pieca wieksza od temperatury ustawionej wkonaj if ((temperatura_pieca) > (temperatura_ustawiona)) { myservo.write(+1); } // jesli temperatura pieca mniejsza od temperatury ustawionej wykonaj if ((temperatura_pieca) < (temperatura_ustawiona)) { myservo.write(-1); } // while ((temperatura_pieca) =temperatura_ustawiona); }
×
×
  • Utwórz nowe...