Съдържание:

Измерване на позициите на пръстите на цигулка с ESP32: 6 стъпки
Измерване на позициите на пръстите на цигулка с ESP32: 6 стъпки

Видео: Измерване на позициите на пръстите на цигулка с ESP32: 6 стъпки

Видео: Измерване на позициите на пръстите на цигулка с ESP32: 6 стъпки
Видео: «Банши Инишерина» - о чём фильм и почему его нужно посмотреть. 2024, Юли
Anonim
Измерване на позицията на пръстите на цигулка с ESP32
Измерване на позицията на пръстите на цигулка с ESP32
Измерване на позициите на пръстите на цигулка с ESP32
Измерване на позициите на пръстите на цигулка с ESP32

Като цигулар винаги съм искал приложение или инструмент, който да ми показва много точно позицията на пръстите ми върху цигулката. С този проект се опитах да го изградя. Въпреки че това е прототип и все още можете да добавите много функции.

Опитах се също да разделя ESP32 и rPI и по този начин накарах ESP32 да изпраща данни безжично към rPi. Което е може би най -трудното нещо в този проект.

Също така е много важно, че в края на този проект нищо не се съхранява на вашия компютър, но е или на rPI, или на ESP32.

Стъпка 1: Материали и инструменти

Материали и инструменти
Материали и инструменти

Преди да навлезем в спецификата на изграждането на този проект, се нуждаем от няколко неща.

  1. 4x Linear Softpot: Линейни потенциометри за измерване на позицията на пръста (цигулката има 4 струни)
  2. ESP32: ESP32 модул за четене на данните от линейните софтуерни точки.
  3. 4/4 цигулка: цигулка за поставяне на линейните софтпотове отгоре.
  4. Raspberry Pi със SD карта: малинов pi, който ще съхранява нашата база данни и уебсайт.
  5. 10k потенциометър: потенциометър за яркостта на LCD дисплея
  6. LCD екран: LCD екран за показване на ip адресите на rPi
  7. Комплект за запояване: За запояване на всички елементи заедно
  8. Проводници от мъжки към мъжки и от мъжки към женски проводници: кабели за свързване на всички елементи
  9. Micro USB кабел: За захранване на ESP32

Стъпка 2: Свързване на Softpots към ESP32

Свързване на софтпота към ESP32
Свързване на софтпота към ESP32

Първо трябва да свържем нашите софтуерни точки към esp32. Свързваме левия и десния щифт съответно към 5V и GND. Свързваме средния щифт към аналогов щифт на ESP32. Също така трябва да свържем средния щифт със съпротивление 10k ohm и да го свържем към GND. Това е така, че нашият изход от софтуерните точки не връща случайна стойност.

След това свързваме ESP32 с micro usb кабела към нашия компютър, за да можем да качим код към него. Ще използваме Arduino IDE за програмиране на ESP32. Но първо трябва да инсталираме ядрото Arduino за 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;

unsigned long onTime;

без подпис дълъг softPotTime;

След това можем да настроим щифтовете си. И ние трябва да стартираме нашия сериен монитор и нашето време.

void setup () {

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); }

void getdata (байт pdata ) {

// Прочетете стойността на ADC на soft pot

След това трябва да прочетем нашите щифтове, за да можем да получим нашите данни.

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 = Имена ;

if (софтпот> 10) {

pdata [0] = i;

pdata [1] = софтпот;

pdata [2] = millis ();

} } }

}

Стъпка 3: Свържете безжично ESP32 и RPI

За безжично свързване на ESP32 и RPI ще използваме библиотека, наречена websocket. За да инсталираме тази библиотека, можем да вземем файловете тук. Ще трябва да променим някои код в самите файлове, за да използваме тази библиотека за ESP32.

Ще трябва да сменим MD5.c и MD5.h.

  • MD5Init към MD5InitXXX
  • MD5Update до MD5UpdateXXX
  • MD5Final до MD5FinalXXX

Ще трябва да изтрием и avr/io.h редовете във файловете sha1.

След това можем да добавим библиотеката към нашата 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);

Стартиране на нашия сървър websocket

WebSocketServer webSocketServer;

Присвояване на нашия SSID и парола за вашия wifi

const char* ssid = "вашият wifi SSID";

const char* password = "вашата wifi парола";

void setup () {

Настройване на вашия сериен монитор

Serial.begin (115200);

Настройване на вашите софтуерни точки

pinMode (SOFT_POT_PIN1, INPUT);

pinMode (SOFT_POT_PIN2, INPUT);

pinMode (SOFT_POT_PIN3, INPUT);

pinMode (SOFT_POT_PIN4, INPUT);

Стартиране на нашия wifi и свързване с него

WiFi.begin (ssid, парола);

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

забавяне (1000);

Serial.println ("Свързване към WiFi.."); }

Serial.println ("Свързан към WiFi мрежата");

Serial.println (WiFi.localIP ());

server.begin (); забавяне (100); }

void getdata (char *pdata) {

Четене на вашите данни

// Прочетете стойността на ADC на soft pot

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);

if (webSocketServer.handshake (клиент)) {

Serial.println ("Клиент свързан");

Изпращане и получаване на данни.

while (client.connected ()) {

char данни [30];

getdata (данни);

Serial.println (данни);

webSocketServer.sendData (данни);

забавяне (10); // Забавяне, необходимо за правилното получаване на данните}

Serial.println ("Клиентът е изключен");

забавяне (100); }

иначе {

Serial.println ("shitsfuckedyo");

} } }

След това за rPI в python:

Импортиране на нашите библиотеки

импортиране на websocketимпортно време

Присвояване на глобална променлива i

i = 0

Задаване на максимум 200 съобщения, които можем да получим

nrOfMessages = 200

клас Websocket ():

def _init _ (себе си):

Инициализиране на нашия websocket и свързването му към нашия ESP32

self.ws = websocket. WebSocket ()

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

Получаване на нашите данни

def работа (себе си):

self.ws.send ("номер на съобщение: 0")

резултат = self.ws.recv () time.sleep (0.5) връщане на резултат

Затваряне на websocket след получаване на всичко

def close (self):

self.ws.close ()

Стъпка 4: Свързване на вашия уебсайт и база данни

Що се отнася до свързването на нашата база данни и уебсайт, първо ще трябва да създадете вашата база данни на pi, като инсталирате mariadb: sudo apt install mariadb.

След това можете да получите достъп до него, като направите: sudo mariadb.

След това ще трябва да създадете и своя уебсайт. Можете да направите това както искате, но трябва да използвате Flask и трябва да имате формуляр в HTML кода си за спиране и стартиране на вашите данни.

След това можете да вмъкнете този код, за да свържете вашата база данни и вашия уебсайт (и вашият уебсайт, и базата данни трябва да са и на вашето pi, това може да стане, като използвате раздела за разгръщане в настройките на pycharm)

от flaskext.mysql импортирайте MySQL

app.config ["MYSQL_DATABASE_HOST"] = "localhost"

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 ()

print ("получаване на данни")

опитвам:

печат (sql)

cursor.execute (sql, params)

с изключение на изключение като e:

печат (д)

връщане False

резултат = курсор.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 ("Fout bij uitvoeren van sql: {0})". формат (д))

връщане False

cursor.close ()

conn.close ()

върнете True

Също така ще трябва да включим нашето приложение, за да можете да правите други неща, докато записвате.

клас ThreadedTask (threading. Thread):

def _init _ (себе си,):

Настройване на нишка

threading. Thread._ init _ (себе си)

Създаване на списък за съхраняване на всички ваши получени данни

self.data_all =

def run (самостоятелно):

time.sleep (5)

Импортирайте свой собствен код на python, където получавате данните

импортиране get_websocket

Получавайте вашите данни

w = receive_websocket. Websocket ()

Добавете данните си в списъка си и ги отпечатайте.

за i в обхват (0, 200):

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

печат (self.data_all)

task = ThreadedTask ()

След това можете да направите task.run (), за да стартирате вашата нишка и да започнете да получавате данни.

Стъпка 5: Свържете всичко заедно

Свързване на всичко заедно
Свързване на всичко заедно

За да стартирате уебсайта си от вашия Pi, трябва да използвате услуга:

[Единица] Описание = 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 = многопотребителска цел

uwsgi-flask.ini, който трябва да поставите в директорията, която сте посочили в ExecStart по-горе

[uwsgi] модул = уеб: app virtualenv =/home/pi/project1/env

master = истински процеси = 5

плъгини = python3

socket = project1.sock chmod-socket = 660 вакуум = вярно

die-on-term = true

Сега можете да прочетете данните си и да ги покажете на уебсайта си.

Стъпка 6: Допълнително: Свързване на LCD екран

Допълнително: Свързване на LCD екран
Допълнително: Свързване на LCD екран
Допълнително: Свързване на LCD екран
Допълнително: Свързване на LCD екран
Допълнително: Свързване на LCD екран
Допълнително: Свързване на LCD екран

Можем да свържем LCD екран, за да можем да покажем ip-адреса на нашия Pi за нашия уебсайт.

импортирайте RPi. GPIO като 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 ()

#Функционален набор self.stuur_instructie (0x3f) #Показване на self.stuur_instructie (0x0c) #Включен + курсор self.stuur_instructie (0x01) @staticmethod def setup (): GPIO.setup (списък, GPIO. OUT) GPIO.setup ([E, RS], GPIO. OUT)

def stuur_instructie (self, byte):

GPIO.изход (E, GPIO. HIGH)

GPIO.изход (RS, GPIO. LOW)

self.set_GPIO_bits (байт)

time.sleep (0.005)

GPIO.изход (E, GPIO. LOW)

def stuur_teken (self, char):

temp = ord (char)

GPIO.изход (E, GPIO. HIGH)

GPIO.изход (RS, GPIO. HIGH)

self.set_GPIO_bits (temp)

time.sleep (0.005)

GPIO.изход (E, GPIO. LOW)

def set_GPIO_bits (self, byte):

за i в обхват (0, 8):

if (байт & (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)

за буква 2 в teken2:

s.stuur_teken (буква2)

if _name_ == '_main_': #Програма, започваща от тук

опитвам:

main ()

с изключение на KeyboardInterrupt:

пропуск

След това можем да създадем услуга за стартиране на LCD при стартиране.

Препоръчано: