Skocz do zawartości

Mechano

Użytkownicy
  • Zawartość

    1021
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    13

Mechano wygrał w ostatnim dniu 6 kwietnia 2016

Mechano ma najbardziej lubianą zawartość!

Reputacja

130 Mistrz

O Mechano

  • Ranga
    7/10
  • Urodziny 07.06.1998

Informacje

  • Płeć
    Mężczyzna
  • Zainteresowania
    elektronika, robotyka, gry

Ostatnio na profilu byli

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

  1. Działam dalej, udało mi się uruchomić pierwszą, działającą wersję. Mam duży problem z pomiarem rzeczywistej temperatury grota. Używam termopary z multimetru, którą wkładam w kroplę cyny na końcu grota, rozgrzewam lutownicę np. do (zmierzonych) 400*C, wyłączam grzałkę i spisuję wyniki z multimetru i z lutownicy. Niestety w ten sposób nie udało mi się zrobić pomiarów które różniły by się np. tylko o 5*C dla tego samego odczytu. To znaczy, że dla jednego odczytu z lutownicy za pierwszym razem mogę mieć temperaturę rzędu 300*C a następnym razem 340*C. Te różnice są niestety spore i nie wiem w jaki sposób mogę do dokładniej zmierzyć. Macie jakieś pomysły? Może muszę użyć innej termopary albo w ogóle robię totalnie źle te pomiary i źle używam termopary? Zamiana wartości odczytanej z ADC na temperaturę odbywa się w dosyć prosty i nieelegancki sposób ale przynajmniej na ten moment działa, póki nie zrobię dokładniej pomiarów. Mam w kodzie zapisane dwie tablice: int tabTemp[39] = {400,390,380,370,360,350,340,330,320,310,300,290,280,270,260,250,240,230,220,210,200,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20}; int odczytTermopara[39] = {575,565,548,532,517,502,487,470,456,441,426,411,396,381,365,350,336,320,305,290,273,259,245,230,212,203,191,175,161,147,139,125,114,96,80,65,50,34,20}; Które potem przeszukuje prostą pętlą: //przeszukiwanie tablicy > odczyt temperatury z tablicy for(int i = 0; i < 39; i++){ if(temp <= odczytTermopara[i]){ temperatura = tabTemp[i]; //temperatura = 50; } } Dalej mam bardzo prosty regulator. Wyznaczam błąd między temperaturą zadaną a rzeczywistą i jeśli jest on większy niż 20*C to grzałka pracuje z pełną mocą a jeśli się zawiera między 0 a 20 to grzałka dostaje trochę ponad połowę pwm'u. Dla błędu mniejszego od 0 grzałka jest wyłączana: blad = nastawa - temperatura; if(blad >= 20){ pwm = 250; //full gas pwm } else if(blad > 0 && blad < 20){ pwm = 150; } else if(blad <= 0){ pwm = 0; } analogWrite(HEATER, pwm); W każdym razie trochę na pałę ale lutownica wreszcie jakoś działa i mogłem pierwszy raz ją przetestować. Lutuje się tym całkiem spoko i raczej nie brakuje mocy (a tej jest ledwie ~20W) ale mam trochę zużyty grot i w kilku miejscach już nie łapie cyny. Muszę zamówić nowy grot i sprawdzić jeszcze raz. Dalej w planach jest dokładniejsze stablicowanie pomiarów temperatury i zaimplementowanie jakieś formy regulatora PID, co dokładnie to się okaże. Raczej staram się tutaj przygotować solidnie jeden etap a potem przejść do następnego, żeby potem nie cofać się z powodu jakiejś pierdoły. Jeśli chodzi o wartości użytkowe to w tej formie jest to totalne nie do użytku Przyciski po bokach tylko przeszkadzają w pewnym chwycie, całość jest za długa a ten wyświetlacz jest praktycznie cały zasłonięty dłonią. Przyciski musiały by być przesunięte gdzieś na tył a wyświetlacz mógłby być między palcami. Jest co poprawiać w drugiej wersji.
  2. Przełom! Zrobiłem dzisiaj kilka większych i mniejszych, fizycznych zmian na płytce lutownicy i odczyt się uspokoił podczas pracy z wyświetlaczem! Konkretnie to: zmieniłem trasę "ścieżki" (przewodu) między wzmacniaczem a ADC, wcześniej kilka razy przechodził z jednej na drugą stronę płytki, teraz idzie tylko górą, przez co jest prawie o połowę krótszy, wzmacniacz i wyświetlacz mają teraz osobne przewody zasilające, łączące się dopiero przy stabilizatorze, dodałem dwa kondensatory ceramiczne 100n bezpośrednio na wejściu i wyjściu stabilizatora 5V, dodałem rezystory podciągające 10k na liniach I2C, dodałem rezystory 1k, szeregowo, na liniach I2C, zmniejszyłem wzmocnienie przez dodanie równolegle drugiego rezystora 200k do tego już wlutowanego, Trudno teraz powiedzieć, która zmiana konkretnie wywołała pożądany efekt ale wreszcie to działa i mogę przejść do następnego etapu. Dziękuję bardzo za pomoc! Postaram się w miarę postępów raportować co się udało a z czym mam problemy. Adminow/moderatorowi zostawiam decyzję czy to ma zostać tutaj, czy może przesunąć to do worklogów.
  3. @atMegaTona Jeszcze dużo brakuje do końca. Przede wszystkim ten kawałek kodu tylko mierzy napięcie wyjściowe, bez żadnego przeliczania na temperaturę a tym bardziej bez żadnej regulacji. Na razie się tym nie zajmuję bo pomiar nadal nie działa tak jakbym chciał. Przy pracującym wyświetlaczu odczyt jest strasznie niestabilny a jak tylko go odłączę to się uspokaja. Bardziej szczegółowo opisałem to w postach wyżej.
  4. Kolejna aktualizacja: Uruchomiłem lutownicę z wyświetlaczem na płytce stykowej obok, zasilanym akumulatorkiem i wtedy całość działała świetnie. Pomiar był stabilny i wyświetlacz działa bardzo dobrze. Na tej podstawie chyba już jasno mogę stwierdzić, że to problem z zasilaniem. Pytanie, co mogę więcej poprawić? Dodać więcej kondensatorów? Może jakiś dławik? Nie mam pojęcia jakiego typu i o jakiej wartości go szukać. Co polecacie? Co do kodu to, przede wszystkim, dziękuję za uwagi. Trochę pozmieniałem i uporządkowałem główną pętlę programu. Jeszcze nie zająłem się tematem różnych typów zmiennych ale to jest następny element do przemyślenia i poprawy. Mam nadzieję, że to już "jakoś" wygląda ale chętnie dowiem się co zrobić, żeby był lepszy. void loop() { if (digitalRead(UP) == 0){ delay(50); if(digitalRead(UP) == 0) nastawa = nastawa + 10; } if (digitalRead(DOWN) == 0){ delay(50); if(digitalRead(DOWN) == 0) nastawa = nastawa - 10; } if(nastawa != poprzednia_nastawa){ nastawa = constrain(nastawa, 0, 250); poprzednia_nastawa = nastawa; } unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; digitalWrite(HEATER, 0); delay(10); temp = read_temperature(); Serial.print(nastawa); Serial.print(" "); Serial.print(temp); Serial.print(" cyk "); analogWrite(HEATER, nastawa); display.setCursor(0, 0); //lewy gorny napis display.println("odcz:"); display.setCursor(0, 20); //lewy srodkowy napis display.println("temp:"); display.display(); } }
  5. Miedź raczej nie jest najlepszym materiałem na grzałkę. Tutaj masz linka do gotowego opisu jak samemu zrobić te rękawiczki. Jest tam też link do odpowiedniego materiału na grzałkę. To, moim zdaniem, dobry punkt wyjścia do dalszych rozważań i testów. https://ebike.nexun.pl/ogrzewane-rekawiczki-ebajkowe/
  6. Oddzielne zasilanie wyświetlacza to dobry pomysł, zrobię to w pierwszej kolejności jak do tego usiądę. Wklejam poniżej cały, obecny kod, którego używam. Mała uwaga: z oczywistych błędów, które mogę wskazać, to funkcja read_temperature() jest zadeklarowana jako float a zmienne jako inty. Tak ma być - testowo tak zrobiłem, żeby "uciąć" przecinek. Nie zauważyłem zmiany w działaniu programu (w sensie zmiany stabilności w opisywanym przypadku) między tymi wersjami, oczywiście poza częścią ułamkową w mierzonej wartości. #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define THERMOCOUPLE A0 #define HEATER 9 #define UP 7 #define DOWN 8 // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); int adc = 0; float napiecie; //float odczyt; //float temp; int odczyt; int temp; int nastawa = 0; unsigned long previousMillis = 0; const long interval = 300; void setup() { Serial.begin(115200); analogReference(INTERNAL); pinMode(HEATER, OUTPUT); pinMode(UP, INPUT_PULLUP); pinMode(DOWN, INPUT_PULLUP); display.begin(SSD1306_SWITCHCAPVCC, 0x3c); display.clearDisplay(); display.setTextSize(2); // Draw 2X-scale text display.setTextColor(WHITE); display.setCursor(10, 0); display.println(F("Lutownica")); display.setTextSize(4); // Draw 2X-scale text display.setCursor(20, 32); display.println("V1.0"); display.display(); delay(2000); } void loop() { if (digitalRead(UP) == 0){ delay(50); if(digitalRead(UP) == 0) nastawa = nastawa + 10; } if (digitalRead(DOWN) == 0){ delay(50); if(digitalRead(DOWN) == 0) nastawa = nastawa - 10; } nastawa = constrain(nastawa, 0, 250); unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; digitalWrite(HEATER, 0); delay(10); Serial.print(nastawa); Serial.print(" "); Serial.print(temp); temp = read_temperature(); } analogWrite(HEATER, nastawa); display.setCursor(0, 0); //lewy gorny napis display.println("odcz:"); display.setCursor(0, 20); //lewy srodkowy napis display.println("temp:"); display.display(); } float read_temperature(){ for(int i=0;i<10;i++){ //pomiar napiecia adc = analogRead(THERMOCOUPLE); odczyt = odczyt + adc; Serial.print(adc); Serial.print(" "); } odczyt = odczyt / 10; napiecie = odczyt * (1.1 / 1024.0); //napiecie ze wzmacniacza napiecie=napiecie*1000; //napiecie w mV ze wzmacniacza Serial.println(""); return (napiecie); }
  7. Chyba znalazłem problem. Analizowałem kod po kawałku i okazuje się, że problem leży bezpośrednio w obecności wyświetlacza w lutownicy. Do działającego kodu dodałem jego obsługę i wyświetlam jakieś proste rzeczy w stylu dwa stałe napisy i dwie zmieniające się liczby. Kiedy wyświetlacz jest wpięty w płytkę (4 goldpiny) i działa to odczyt skacze jak wcześniej opisywałem. Kiedy uruchomię lutownicę bez niego albo wyjmę go w czasie pracy (chociaż pewnie nie powinienem) to odczyt się stabilizuje w ciągu jednej - dwóch sekund. Jeżeli teraz włożę wyświetlacz to nie uruchamia się (bo inicjalizacja jest tylko w setup()) i wyniki nadal są dobre. Na tej podstawie wnioskuję, że to problemy z zasilaniem. Dodałem dwa kondensatory 100nF, jeden na module wyświetlacza, drugi na płytce lutownicy, na goldpinach. Niestety to nic nie dało i wynik nadal skacze. Próbowałem też podłączać wyświetlacz na przewodach, żeby odsunąć go od wzmacniacza ale to też nic nie daje. Może powinienem dołożyć kondensator jeszcze przy wzmacniaczu? I do tego jakiś dławik, tylko pytanie jakieś wartości i czy w jakimś konkretnym miejscu czy tuż przy wzmacniaczu? Ostatni pomysł jaki mam to rozdzielenie zasilania na część cyfrową i analogową i połączenie ich dopiero przy stabilizatorze. Wbrew pozorom to dla mnie całkiem ciekawa lekcja obserwowania takich zjawisk na żywym organizmie własnej konstrukcji i pierwszy raz się z czymś takim na poważnie spotykam.
  8. Mała aktualizacja. Przede wszystkim, przepraszam za tak długą przerwę. Po prostu organizuję teraz pewien event w wolnym czasie i nie mam go wiele więcej na żaden projekt ale o nim nie zapomniałem! Przez cały ten czas nie zaglądałem nawet do tego tematu, żeby się nie nakręcać i nie dekoncentrować. Znalazłem wreszcie chwilę czasu i w pewien dosyć dziwny sposób pośrednio wpadłem na winowajcę (chociaż na razie tego sam nie rozumiem). Chodzi o to, że zawsze robiąc projekt tego typu zaczynam od programów obsługujących poszczególne bloki, tutaj osobno był to pomiar temperatury, grzałka, wyświetlacz, przyciski. Gdy stwierdzę, że działają one jak powinny to zlepiam je w całość i dodaję do takiego programu potrzebne funkcje, ficzery itd. W tym momencie mam stary program, w którym jest wszystko co wyżej i był bazowany na projekcie z pierwszej strony, który nigdy nie działał dobrze (tutaj mam też poprawiony pomiar temperatury). Jest też drugi program, który pisałem sam od zera i mam tam tylko prostą obsługę przycisków, grzałki i termopary. Różnica w funkcjonalności jest znaczna (w przedstawionej sytuacji całość zasilam z zasilacza, nie z usb) - pierwszy program ma takie rozrzuty mierzonej wartości jak opisywałem ostatnio i na nim prowadziłem wtedy test. Dzisiaj odpaliłem na tym drugim, żeby nie używać wyświetlacza, który teraz jest mi niepotrzebny i Eureka! wyniki są całkiem stabilne, kolejno wyświetlane w monitorze wartości różnią się tylko o kilka jednostek, nie ma żadnych wachnięć przy grzaniu albo chłodzeniu. Byłem całkiem pod wrażeniem bo nie widziałem tutaj problemu (tego co wyżej). Wgrałem więc z powrotem pierwszy program i poniekąd znowu Eureka! wrócił stary błąd. Co więcej, jeśli teraz wgram znowu drugi program to wachnięcia się utrzymują ale gdy odłączę lutownicę od zasilacza i podłączę jeszcze raz jest znowu stabilnie. Na razie nie chcę Wam pokazywać obu programów tylko pobawię się w detektywa i spróbuję sam znaleźć błąd. Jakby co to wiem gdzie się udać. Dzięki bardzo bo już dużo pomogliście i sam bym pewnie na te rzeczy nie wpadł. Niestety kolejna aktualizacja może się pojawić dopiero w ciągu kilki dni.
  9. Przepraszam, że nie odpisywałem, jestem ostatnio zajęty czymś zupełnie innym. Chyba nie ma co się pakować w bezszczotki przy tak ograniczonym budżecie. Jak na moje te silniki szczotkowe z wkrętarek powinny być wporzo. A co do sterowania ich to chyba ten niebieski moduł z BTS7960 powinien dać radę. Osobiście nigdy ich nie miałem w rękach i nie testowałem ich ale widziałem je w kilku miejscach na yt i dawały radę. Jeżeli zależy ci na sterowaniu tym z aparatury modelarskiej to chyba najłatwiej będzie mierzyć czas impulsów (np. przez arduino) i sterowaniem silników przez te mostki (to tak w bardzo ogólnym ujęciu), zwłaszcza, że jeżeli to ma być robot sumo to powinien być autonomiczny, więc jakiś mikrokontroler na pokładzie i tak pewnie będzie.
  10. Osobiście bym się zbyt wiele nie zastanawiał tylko brał silniki z wkrętarek. Mają chyba większą moc (są szybsze i mają pewnie podobny jak nie większy moment niż silniki z wycieraczek). A kwestią mocowania do robota i koła do przekładni bym się nie martwił. Silnik jest okrągły więc można to rozwiązać jakąś obejmą albo okrągłym mocowaniem a w przekładni powinny być od boku otwory albo wypustki, o które można zablokować ją w korpusie robota. A co do koła to wrzeciono jest nakręcane na gwint wałka wyjściowego z przekładni plus wewnątrz jest zawsze śruba z lewym gwintem do dodatkowego mocowania.
  11. Jest progres. Dodałem jedną diodę prostowniczą na wejściu wzmacniacza i widać poprawę. Za pomocą funkcji micros() wypisywałem sobie jednocześnie odczytywane napięcie z termopary i czas działania. Na tej podstawie po wyłączeniu grzałki sprawdzałem ile czasu wymaga ustabilizowanie się napięcie (jako stabilne przyjąłem dwa identyczne pomiary), wychodziło regularnie ok. 5-6ms więc dla pewności ustawiłem delay na 10ms. W ten sposób odczyt napięcia działa całkiem nieźle również dla wyższych temperatur. Problem jaki zauważyłem to bardzo zaszumiony pomiar w momencie kiedy całość jest zasilana z zasilacza a nie z usb (nie zasilam wtedy grzałki, tylko mikrokontroler i wzmacniacz). W 10 próbkach, z których wyciągam średnią są odchyłki: dla 50mV z termopary rozstrzały są od ~10 do nawet ~70mV, dla 300mv > +- ~50mV dla 800mV > +- ~60mV Te różnice to kwestia filtracji zasilania, szumów wzmacniacza czy może jeszcze czegoś innego? Dodam tylko, że przy zasilaniu z usb te różnice wynoszą maksymalnie kilka mV, również dla większych wartości. Drugi problem jaki widzę, to zbyt duże wzmocnienie sygnału z termopary. Używam wewnętrznego napięcia odniesienia 1.1V a przy temperaturze topnienia cyny mikrokontroler mierzy już ok 900-1000mV. W teorii wystarczyło by już zmniejszenie wzmocnienia o dwukrotnie ale dla bezpieczeństwa chyba lepiej byłoby je zmniejszyć 3- albo i 4-krotnie. Jak myślicie? Dzięki za dotychczasową pomoc!
  12. To mam w sumie jeszcze jeden pomysł. Niedawno na popularnym portalu aukcyjnym były do kupienia (może jeszcze są, nie sprawdzałem) silniki od hoverboardów (takich balansujących desek. Ja swoją parę kupiłem za jakąś stówkę chyba i w komplecie dostałem całą uszkodzoną deskę bez akumulatora. Co prawda tamte opony się do sumo kompletnie nie nadają ale myślę, że można by je trochę "przyciąć" albo odlać z silikonu nowe (kiedyś popularne wśród budowniczych lf'y ale nie wiem czy na taką skalę). Do tego tanie sterowniki do ebajków z ebaya, koło 10$ sztuka (koniecznie czujnikowe!) i mamy całkiem mocny napęd za nie dużą kwotę. Z minusów to te silniki na oko ważą jakiś kilogram sztuka i mają z ~17cm średnicy (z oponą).
  13. Jeżeli silniki od wkrętarek nie pasują to może silniki od wycieraczek samochodowych (chociaż mogą być ciut za wolne) albo od wkrętaków elektrycznych (często w marketach, nie tylko budowlanych, na 3.6-3.7V, sporo mniejsze i kosztują coś koło 50zł sztuka). A używane silniki z przekładniami z wkrętarek nie idzie dostać czy za duże/ciężkie?
  14. Nie masz problemu z antywirusem? Kiedyś mi codeblocks przestawał działać bo antywirus blokował programy spoza komputera (przyniesione na pendrivie albo pobrane z moodla).
×
×
  • Utwórz nowe...