W tym samouczku zamierzamy opracować obwód wykorzystujący czujnik FLEX, Arduino Uno i silnik Servo. Ten projekt to system sterowania serwomechanizmem, w którym położenie wału serwomechanizmu jest określane przez ugięcie, wygięcie lub odchylenie czujnika FLEX.
Porozmawiajmy najpierw trochę o silnikach serwo. Serwomotory są używane, gdy istnieje potrzeba dokładnego ruchu lub położenia wału. Nie są one proponowane do zastosowań o dużej szybkości. Są one proponowane do zastosowań z małą prędkością, średnim momentem obrotowym i dokładnym położeniem. Silniki te są używane w robotycznych maszynach, układach sterowania lotem i systemach sterowania. Serwosilniki są używane w systemach wbudowanych, takich jak automaty sprzedające itp.
Serwomotory są dostępne w różnych kształtach i rozmiarach. Serwomotor będzie miał głównie przewody, jeden jest przeznaczony do napięcia dodatniego, drugi do masy, a ostatni do ustawiania położenia. Przewód CZERWONY jest podłączony do zasilania, przewód czarny jest podłączony do masy, a przewód ŻÓŁTY jest podłączony do sygnału.
Silnik serwo to połączenie silnika prądu stałego, systemu kontroli położenia, przekładni. Położenie wału silnika prądu stałego jest regulowane przez elektronikę sterującą serwomechanizmu na podstawie współczynnika wypełnienia sygnału PWM pinu SIGNAL.
Mówiąc najprościej, elektronika sterująca reguluje położenie wału, sterując silnikiem prądu stałego. Dane dotyczące położenia wału przesyłane są poprzez pin SIGNAL. Dane o położeniu do sterowania należy przesłać w postaci sygnału PWM poprzez pin Signal serwomotoru.
Częstotliwość sygnału PWM (modulowana szerokością impulsu) może się różnić w zależności od typu serwomotoru. Ważną rzeczą jest tutaj DUTY RATIO sygnału PWM. Na podstawie tego CŁA elektronika sterująca reguluje wał. Aby wał można było przesunąć na zegar 9o, WSPÓŁCZYNNIK WŁĄCZENIA musi wynosić 1/18. 1 milisekunda „czasu włączenia” i 17 milisekund „czasu wyłączenia” w sygnale 18 ms.
Aby przesunąć wał na zegar 12o, czas załączenia sygnału musi wynosić 1,5 ms, a czas wyłączenia 16,5 ms. Współczynnik ten jest dekodowany przez układ sterowania w serwomechanizmach i na jego podstawie dostosowuje położenie.
Ten PWM tutaj jest generowany przy użyciu ARDUINO UNO. Na razie więc wiemy, że możemy sterować wałem serwomotoru, zmieniając współczynnik wypełnienia sygnału PWM generowanego przez Arduino Uno. UNO ma specjalną funkcję, która pozwala nam podać pozycję SERWO bez zakłócania sygnału PWM. Jednak ważne jest, aby znać stosunek pracy PWM do pozycji serwomechanizmu. Porozmawiamy o tym więcej w opisie.
Porozmawiajmy teraz o FLEX SENSOR. Aby połączyć czujnik FLEX z ARDUINO UNO, użyjemy 8-bitowej funkcji ADC (konwersja analogowo-cyfrowa). Czujnik FLEX to przetwornik, który zmienia swoją rezystancję, gdy zmienia się jego kształt. Czujnik FLEX ma 2,2 cala długości lub długość palca. Jest to pokazane na rysunku.
Czujnik Flex to przetwornik, który zmienia swoją rezystancję, gdy powierzchnia liniowa jest wygięta. Stąd nazwa flex sensor. Mówiąc najprościej, rezystancja zacisków czujnika wzrasta, gdy jest zgięty. Pokazuje to poniższy rysunek.
Ta zmiana oporu nie przyniesie nic dobrego, jeśli nie będziemy w stanie ich odczytać. Kontroler pod ręką może tylko odczytać szanse w napięciu i nic mniej, w tym celu użyjemy obwodu dzielnika napięcia, dzięki czemu możemy wyliczyć zmianę rezystancji jako zmianę napięcia.
Dzielnik napięcia jest obwodem rezystancyjnym i jest pokazany na rysunku. W tej sieci rezystancyjnej mamy jedną stałą rezystancję i drugą zmienną rezystancję. Jak pokazano na rysunku, R1 to tutaj stała rezystancja, a R2 to czujnik FLEX, który działa jako rezystancja.
Do pomiaru brany jest środek odgałęzienia. Wraz ze zmianą R2 mamy zmianę w Vout. Więc przy tym mamy napięcie, które zmienia się wraz z ciężarem.
Ważną rzeczą do zapamiętania jest to, że sygnał wejściowy pobierany przez kontroler do konwersji ADC wynosi zaledwie 50 µA. Ten efekt obciążenia dzielnika napięcia opartego na rezystancji jest ważny, ponieważ prąd pobierany z Vout dzielnika napięcia zwiększa procentowy wzrost błędu, na razie nie musimy się martwić o efekt obciążenia.
FLEX SENSOR po zgięciu zmienia się jego rezystancja. Po podłączeniu tego przetwornika do obwodu dzielnika napięcia, będziemy mieli zmieniające się napięcie z FLEX na przetworniku. To zmienne napięcie jest podawane do jednego z kanałów ADC, będziemy mieć wartość cyfrową odnoszącą się do FLEX.
Dopasujemy tę wartość cyfrową do pozycji serwomechanizmu, dzięki czemu będziemy mieli sterowanie serwomechanizmem przez flex.
składniki
Sprzęt: Arduino Uno , zasilacz (5v), kondensator 1000 uF, kondensator 100nF (3 sztuki), rezystor 100KΩ, SILNIK SERWO (SG 90), rezystor 220Ω, czujnik FLEX.
Oprogramowanie: Atmel studio 6.2 lub Aurdino nightly.
Schemat obwodu i wyjaśnienie
Schemat obwodu serwo sterowanie silnika za pomocą czujnika FLEX przedstawiono na rysunku poniżej.
Napięcie na czujniku nie jest całkowicie liniowe; będzie głośno. Aby odfiltrować szum, kondensatory są umieszczone na każdym rezystorze w obwodzie dzielnika, jak pokazano na rysunku.
Tutaj weźmiemy napięcie dostarczane przez dzielnik (napięcie, które liniowo reprezentuje wagę) i wprowadzimy je do jednego z kanałów ADC Arduino UNO. Użyjemy do tego A0. Po inicjalizacji ADC będziemy mieli wartość cyfrową reprezentującą wygięty czujnik. Przyjmiemy tę wartość i dopasujemy ją do pozycji serwomechanizmu.
Aby tak się stało, musimy wprowadzić kilka instrukcji w programie i omówimy je szczegółowo poniżej.
ARDUINO ma sześć kanałów ADC, jak pokazano na rysunku. W nich jeden lub wszystkie z nich mogą być użyte jako wejścia dla napięcia analogowego. UNO ADC ma rozdzielczość 10 bitów (czyli wartości całkowite z (0- (2 ^ 10) 1023)). Oznacza to, że będzie mapował napięcia wejściowe od 0 do 5 woltów na wartości całkowite z przedziału od 0 do 1023. Tak więc dla każdego (5/1024 = 4,9 mV) na jednostkę.
Tutaj użyjemy A0 z UNO.
Musimy wiedzieć kilka rzeczy.
|
Przede wszystkim kanały UNO ADC mają domyślną wartość odniesienia 5V. Oznacza to, że możemy podać maksymalne napięcie wejściowe 5 V do konwersji ADC na dowolnym kanale wejściowym. Ponieważ niektóre czujniki dostarczają napięcia od 0-2,5 V, przy wartości odniesienia 5 V uzyskujemy mniejszą dokładność, więc mamy instrukcję, która umożliwia nam zmianę tej wartości odniesienia. Tak więc do zmiany wartości odniesienia mamy („analogReference ();”) Na razie zostawiamy ją jako.
Domyślnie otrzymujemy maksymalną rozdzielczość ADC płyty, która wynosi 10 bitów, rozdzielczość tę można zmienić za pomocą instrukcji („analogReadResolution (bits);”). Ta zmiana rozdzielczości może się przydać w niektórych przypadkach. Na razie zostawiamy to jako.
Teraz, jeśli powyższe warunki są ustawione na domyślne, możemy odczytać wartość z ADC kanału '0' bezpośrednio wywołując funkcję „analogRead (pin);”, tutaj „pin” oznacza pin, do którego podłączyliśmy sygnał analogowy, w tym przypadku jest to byłoby „A0”.
Wartość z ADC można przyjąć jako liczbę całkowitą jako „int SENSORVALUE = analogRead (A0); ”, W tej instrukcji wartość po ADC zostaje zapisana jako liczba całkowita„ SENSORVALUE ”.
Porozmawiajmy teraz o SERWO, UNO ma funkcję, która pozwala nam kontrolować pozycję serwomechanizmu po prostu podając wartość stopnia. Powiedzmy, że jeśli chcemy, aby serwo miało wartość 30, możemy bezpośrednio przedstawić wartość w programie. Plik nagłówkowy SERVO zajmuje się wewnętrznie wszystkimi obliczeniami współczynnika wypełnienia.
#zawierać
Serwo serwo; servo.attach (3); servo.write (stopnie); |
Pierwsza instrukcja reprezentuje plik nagłówkowy do sterowania SILNIKIEM SERWO.
Drugą instrukcją jest nazwanie serwomechanizmu; zostawiamy to jako samo serwo.
Trzecie stwierdzenie określa, gdzie jest podłączony pin sygnału serwa; musi to być pin PWM. Tutaj używamy PIN3.
Czwarte stwierdzenie zawiera polecenia dotyczące pozycjonowania serwomotoru i jest podane w stopniach. Jeśli podano 30, serwomotor obraca się o 30 stopni.
Teraz sg90 może poruszać się w zakresie 0-180 stopni, mamy wynik ADC 0-1024
Więc ADC jest około sześć razy większa niż POZYCJA SERWOWA. Więc dzieląc wynik ADC przez 6 otrzymamy przybliżoną pozycję ręki SERVO.
Dzięki temu będziemy mieli wartość położenia serwomechanizmu podawaną do serwomotoru, która jest proporcjonalna do wygięcia lub wygięcia. Kiedy ten czujnik flex jest zamontowany na rękawicy, możemy kontrolować pozycję serwomechanizmu za pomocą ruchu ręki.