Мазмуну:

ESP32 менен скрипкадагы манжалардын абалын өлчөө: 6 кадам
ESP32 менен скрипкадагы манжалардын абалын өлчөө: 6 кадам

Video: ESP32 менен скрипкадагы манжалардын абалын өлчөө: 6 кадам

Video: ESP32 менен скрипкадагы манжалардын абалын өлчөө: 6 кадам
Video: Создана роботизированная рука с тактильным чувством - 3D Bioprinters 2024, Июль
Anonim
ESP32 менен скрипкадагы манжалардын абалын өлчөө
ESP32 менен скрипкадагы манжалардын абалын өлчөө
ESP32 менен скрипкадагы манжалардын абалын өлчөө
ESP32 менен скрипкадагы манжалардын абалын өлчөө

Скрипкачы катары мен ар дайым скрипкадагы манжаларымдын абалын көрсөтө турган колдонмону же куралды эңсечүмүн. Бул долбоор менен мен муну курууга аракет кылдым. Бул прототип болсо да, сиз дагы көптөгөн функцияларды кошо аласыз.

Мен ошондой эле ESP32 менен rPIди ажыратууга аракет кылдым, ошондуктан ESP32ди rPiге зымсыз маалыматтарды жөнөтүүгө мажбур кылдым. Бул, балким, бул проекттеги эң кыйын нерсе.

Бул долбоордун аягында сиздин компьютерде эч нерсе сакталбаганы абдан маанилүү, бирок ал rPI же ESP32де.

1 -кадам: материалдар жана инструменттер

Материалдар жана куралдар
Материалдар жана куралдар

Бул долбоорду куруунун өзгөчөлүктөрүнө кирүүдөн мурун, биз бир нече нерсеге муктажбыз.

  1. 4x сызыктуу Softpot: манжанын абалын өлчөө үчүн сызыктуу потенциометрлер (скрипкада 4 кыл бар)
  2. ESP32: ESP32 модулу сызыктуу softpotsтон маалыматтарды окуу үчүн.
  3. 4/4 скрипка: сызыктуу соптотторду үстүнө коюу үчүн скрипка.
  4. SD картасы бар Raspberry Pi: биздин базаны жана веб -сайтыбызды сактай турган малина пи.
  5. 10k потенциометр: ЖКнын жарыктыгы үчүн потенциометр
  6. ЖК-экран: rPiдин IP адрестерине көрсөтүү үчүн LCD экран
  7. Soldering Kit: Бардык элементтерди бириктирүү үчүн
  8. Эркек-эркек зымдары жана эркек-ургаачы зымдар: Бардык элементтерди туташтыруу үчүн кабелдер
  9. Микро USB кабели: ESP32ди иштетүү үчүн

2 -кадам: Softpotsту ESP32ге туташтыруу

Softpotsту ESP32ге туташтыруу
Softpotsту ESP32ге туташтыруу

Биринчиден, биз SoftPOTторубузду esp32ге туташтырышыбыз керек. Биз сол жана оң казыктарды тиешелүү түрдө 5V жана GNDге туташтырабыз. Биз орто пинди ESP32деги аналогдук пинге туташтырабыз. Биз ошондой эле 10к Ом каршылыгы бар орто пинди туташтырып, муну GNDге туташтырышыбыз керек. Бул биздин softpots чыгарылышыбыз туш келди маанини кайтарбашы үчүн.

Андан кийин биз ESP32ди микро USB кабели менен компьютерибизге туташтырабыз, ошондо биз кодду жүктөй алабыз. Биз ESP32ди программалоо үчүн Arduino IDE колдонобуз. Бирок адегенде биз ESP32 үчүн Arduino өзөгүн орнотушубуз керек, ошондо биз аны жүктөй алабыз. Муну бул жерде жасаса болот.

Андан кийин биз код жаза баштайбыз.

Алгач биз пинптерибизди орнотушубуз керек, ага биз жумшак оюктун ортоңку төөнөгүчүн туташтырдык.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

кол коюлбаган узак убакыт;

кол коюлбаган узак softPotTime;

Ошондо биз казыктарыбызды орното алабыз. Жана биз сериялык мониторубузду жана убактыбызды башташыбыз керек.

жараксыз орнотуу () {

onTime = millis ();

Serial.begin (115200);

Serial.println ("Программанын башталышы");

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT); }

жараксыз маалымат (байт pdata ) {

// Жумшак идиштин ADC маанисинде окуңуз

Анан биз өзүбүздүн маалыматыбызды ала алышыбыз үчүн казыктарыбызды окуубуз керек.

int softPotADC1 = analogRead (SOFT_POT_PIN1);

nt softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Андан кийин биз баалуулуктарды тизмеге киргизип, кийинчерээк оңой чыгара алабыз.

үчүн (int i = 0; i <4; i ++) {

int Аттар = {softPotADC1, softPotADC2, softPotADC3, softPotADC4};

int softpot = Аттар ;

эгер (softpot> 10) {

pdata [0] = i;

pdata [1] = softpot;

pdata [2] = миллис ();

} } }

}

3 -кадам: ESP32 менен RPIди зымсыз туташтыруу

ESP32 жана RPIди зымсыз туташтыруу үчүн, вебсокет деп аталган китепкананы колдонобуз. Бул китепкананы орнотуу үчүн, биз бул жерден файлдарды ала алабыз. Бул китепкананы ESP32 үчүн колдонуу үчүн файлдардын өзүндөгү кээ бир кодду өзгөртүүбүз керек болот.

Биз MD5.c жана MD5.h өзгөртүшүбүз керек болот.

  • MD5Init to MD5InitXXX
  • MD5UpdateXXXке MD5Update
  • MD5Final үчүн MD5FinalXXX

Биз ошондой эле sha1 файлдарындагы avr/io.h линияларын жок кылышыбыз керек.

Андан кийин биз китепкананы биздин Arduino IDEге эскиз менен кошо алабыз> китепкананы кошуу>. ZIP китепканасын кошуу жана андан кийин китепканаңызды zip файлында тандай алабыз.

Андан кийин биз кодубузду жаза баштайбыз.

Биринчи ESP32 үчүн:

Анын ичинде биздин китепкана

#кошуу #кошуу

Кайра өзүбүздүн түйүндөрдү дайындоо.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

Wifi серверибизди дайындоо

WiFiServer сервери (80);

Веб -сайтыбыздын серверин иштетүү

WebSocketServer webSocketServer;

Сиздин SSID менен Wi -Fi сырсөзүңүздү дайындоо

const char* ssid = "сиздин WiFi SSID";

const char* password = "сиздин wifi сырсөзүңүз";

жараксыз орнотуу () {

Сериялык мониторду орнотуу

Serial.begin (115200);

Жумшак пункттарыңыз жөндөлүүдө

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT);

Wi -Fi иштетип, ага туташып жатабыз

WiFi.begin (ssid, сырсөз);

while (WiFi.status ()! = WL_CONNECTED) {

кечигүү (1000);

Serial.println ("WiFi'ге туташууда.."); }

Serial.println ("WiFi тармагына туташкан");

Serial.println (WiFi.localIP ());

server.begin (); кечиктирүү (100); }

жараксыз маалымат (char *pdata) {

Дайындарыңыз окулууда

// Жумшак казандын ADC маанисинде окуңуз

int softPotADC1 = analogRead (SOFT_POT_PIN1);

int softPotADC2 = analogRead (SOFT_POT_PIN2);

int softPotADC3 = analogRead (SOFT_POT_PIN3);

int softPotADC4 = analogRead (SOFT_POT_PIN4);

Маалыматтарды тизмеге жайгаштыруу жана он алтылыкка айландыруу.

sprintf (pdata, " %x, %x, %x, %x, %x", softPotADC1, softPotADC2, softPotADC3, softPotADC4, millis ());

}

void loop () {

Кардарыңызды туташтыруу (rPI)

WiFiClient клиенти = server.available ();

if (client.connected ()) {

кечигүү (10);

эгер (webSocketServer.handshake (кардар)) {

Serial.println ("Кардар туташты");

Маалыматтарды жөнөтүү жана алуу.

while (client.connected ()) {

char маалыматтары [30];

getdata (маалыматтар);

Serial.println (маалыматтар);

webSocketServer.sendData (маалыматтар);

кечигүү (10); // Маалыматты туура кабыл алуу үчүн кечигүү керек}

Serial.println ("Кардар ажыратылды");

кечиктирүү (100); }

башка {

Serial.println ("shitsfuckedyo");

} } }

Андан кийин pythonдогу rPI үчүн:

Биздин китепканаларды импорттоо

веб -сайтты импорттоо убактысы

Глобалдык өзгөргүчтү дайындоо i

i = 0

Биз ала турган 200 билдирүүнүн максимумун коюу

nrOfMessages = 200

класс Websocket ():

def _init _ (өзүн):

Веб -сайтыбызды баштоо жана аны ESP32ге туташтыруу

self.ws = websocket. WebSocket ()

self.ws.connect ("ws: //172.30.248.48/")

Биздин маалыматтарды алуу

def work (өз алдынча):

self.ws.send ("билдирүү nr: 0")

result = self.ws.recv () time.sleep (0.5) return result

Баарын алгандан кийин вебсокеттин жабылышы

def close (өзүн):

self.ws.close ()

4 -кадам: Веб -сайтыңызды жана маалымат базаңызды туташтыруу

Биздин маалымат базабыз менен веб -сайтыбызды туташтыра турган болсок, биринчи кезекте mariadb: sudo apt install mariadb орнотуу менен пи боюнча маалымат базаңызды түзүшүңүз керек болот.

Андан кийин сиз ага кире аласыз: sudo mariadb.

Андан кийин сиз дагы веб -сайтыңызды түзүшүңүз керек болот. Сиз муну каалаганыңыздай кыла аласыз, бирок сиз Flaskти колдонушуңуз керек жана HTMLиңизде маалыматтарды токтотуу жана баштоо үчүн форма болушу керек.

Андан кийин, бул кодду маалымат базаңыз менен веб -сайтыңызды туташтыруу үчүн кыстарсаңыз болот (веб -сайтыңыз да, маалымат базасы да сиздин пиңизде болушу керек, муну pycharmдын жөндөөлөрүндө жайылтуу өтмөгүн колдонуу менен жасаса болот)

flaskext.mysql дан MySQL импорттоо

app.config ["MYSQL_DATABASE_HOST"] = "жергиликтүү хост"

app.config ["MYSQL_DATABASE_DB"] = "маалымат базаңыздын аты"

app.config ["MYSQL_DATABASE_USER"] = "сиздин маалымат базаңыздын колдонуучусу"

app.config ["MYSQL_DATABASE_PASSWORD"] = "маалымат базаңыздын сырсөзү"

Биздин маалымат базасынан маалыматтарды алуу функциясы.

def get_data (sql, params = None):

conn = mysql.connect ()

курсор = conn.cursor ()

басып чыгаруу ("маалыматтарды алуу")

аракет кыл:

басып чыгаруу (sql)

cursor.execute (sql, params)

e сыяктуу өзгөчө учурларды кошпогондо:

басып чыгаруу (e)

жалган кайтаруу

натыйжа = cursor.fetchall ()

маалыматтар =

натыйжада катар үчүн:

data.append (тизме (катар))

cursor.close ()

Conn.close ()

маалыматтарды кайтаруу

Биздин маалымат базасына маалыматтарды киргизүү функциясы

def set_data (sql, params = None):

conn = mysql.connect ()

курсор = conn.cursor ()

аракет кыл:

log.debug (sql)

cursor.execute (sql, params) conn.commit ()

log.debug ("SQL uitgevoerd")

e сыяктуу өзгөчө учурларды кошпогондо:

log.exception ("Sql: {0})" форматы (e))

жалган кайтаруу

cursor.close ()

Conn.close ()

кайра True

Биз ошондой эле жазуу учурунда башка нерселерди жасай алышыбыз үчүн биздин колдонмону жипке салуубуз керек болот.

класс ThreadedTask (threading. Thread):

def _init _ (өзүн,):

Жипти жөндөө

Thread. Thread._ init _ (өзүнчө)

Алынган маалыматтардын бардыгын сактоо үчүн тизме түзүү

self.data_all =

def run (өзүнчө):

убакыт.уйку (5)

Маалыматты алган өзүңүздүн питон кодуңузду импорттоңуз

receive_websocket импорттоо

Маалыматыңызды алыңыз

w = receive_websocket. Websocket ()

Тизмеңизге маалыматтарды кошуп, басып чыгарыңыз.

i үчүн диапазондо (0, 200):

self.data_all.append (w.work (). split (","))

басып чыгаруу (self.data_all)

тапшырма = ThreadedTask ()

Андан кийин, Thread'ти баштоо жана маалыматтарды кабыл алуу үчүн task.run () жасай аласыз.

5 -кадам: Бардыгын бириктирүү

Бардыгын Биригип
Бардыгын Биригип

Пиңизден веб -сайтыңызды иштетүү үчүн сиз кызматты колдонушуңуз керек:

[Unit] Description = uWSGI мисалы, project1 веб интерфейсин тейлейт

Кийин = network.target

BindsTo = mysqld.service

Кийин = mysqld.service

[Кызмат]

Колдонуучуну өзгөртүү

Колдонуучу = pi

Топ = www-маалыматтар

Бул жерде сиз Flask файлыңыздын каталогун киргизишиңиз керек

WorkingDirectory =/home/pi/project1/web

Ini файлыңыздын каталогун кийинчерээк таба аласыз.

ExecStart =/usr/bin/uwsgi --ini /home/pi/project1/conf/uwsgi-flask.ini

[Орнотуу]

WantedBy = multi-user.target

uwsgi-flask.ini, сиз жогоруда ExecStartта көрсөтүлгөн каталогго салышыңыз керек

[uwsgi] модуль = веб: колдонмо virtualenv =/home/pi/project1/env

мастер = чыныгы процесстер = 5

плагиндер = python3

розетка = проект1. байпак chmod-розетка = 660 боштук = чын

мөөнөттүү = чындык

Эми сиз маалыматыңызды окуп, веб -сайтыңызда көрсөтө аласыз.

6 -кадам: Кошумча: ЖК экранды туташтыруу

Кошумча: ЖК экранды туташтыруу
Кошумча: ЖК экранды туташтыруу
Кошумча: ЖК экранды туташтыруу
Кошумча: ЖК экранды туташтыруу
Кошумча: ЖК экранды туташтыруу
Кошумча: ЖК экранды туташтыруу

Биз ЖК экранды туташтыра алабыз, ошондо биздин веб-сайтыбыздын Pi дарегин көрсөтө алабыз.

GPO импорттоо убактысы катары RPi. GPIO импорттоо

импорттоо буйруктары

GPIO.cleanup ()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

тизме = [22, 5, 6, 13, 19, 26, 20, 21]

E = 24

RS = 23

класс экраны:

def _init _ (өзүн):

GPIO.setmode (GPIO. BCM)

self.setup ()

#Функция set.stuur_instructie (0x3f) #Display self.stuur_instructie (0x0c) #On + курсору self.stuur_instructie (0x01) @staticmethod def setup (): GPIO.setup (тизме, GPIO. OUT) GPIO.setup ([E, RS], GPIO. OUT)

def stuur_instructie (өзүнчө, байт):

GPIO.output (E, GPIO. HIGH)

GPIO.output (RS, GPIO. LOW)

self.set_GPIO_bits (байт)

time.sleep (0.005)

GPIO.output (E, GPIO. LOW)

def stuur_teken (өзүн, чар):

темп = орд (char)

GPIO.output (E, GPIO. HIGH)

GPIO.output (RS, GPIO. HIGH)

self.set_GPIO_bits (темп)

time.sleep (0.005)

GPIO.output (E, GPIO. LOW)

def set_GPIO_bits (өзүнчө, байт):

i үчүн диапазондо (0, 8):

эгер (байт & (2 ** i)) == 0:

GPIO.output (тизме , GPIO. LOW)

башка:

GPIO.output (тизме , GPIO. HIGH)

def main ():

s = Экран ()

teken = "Жергиликтүү IP дареги:"

текендеги кат үчүн:

s.stuur_teken (тамга)

teken2 = commands.getoutput ("ip addr show wlan0 | grep -Po 'inet / K [d.]+'")

басып чыгаруу (teken2)

s.stuur_instructie (0xc0)

teken2деги 2 -кат үчүн:

s.stuur_teken (тамга2)

if _name_ == '_main_': #Программа ушул жерден башталат

аракет кыл:

негизги ()

KeyboardInterruptдон башка:

өтүү

Андан кийин биз ЖКны баштоо боюнча кызматты түзө алабыз.

Сунушталууда: