Оглавление:

Измерение положения пальцев на скрипке с помощью ESP32: 6 шагов
Измерение положения пальцев на скрипке с помощью ESP32: 6 шагов

Видео: Измерение положения пальцев на скрипке с помощью ESP32: 6 шагов

Видео: Измерение положения пальцев на скрипке с помощью ESP32: 6 шагов
Видео: Когда Контрнаступление Украины? (10 июня 2023) 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-картой: Raspberry Pi, в котором будет храниться наша база данных и веб-сайт.
  5. Потенциометр 10k: потенциометр яркости ЖК-дисплея
  6. ЖК-экран: ЖК-экран для отображения IP-адреса rPi
  7. Комплект для пайки: для пайки всех элементов вместе
  8. Провода «папа-папа» и «папа-мама»: кабели для соединения всех элементов
  9. Кабель Micro USB: для питания ESP32

Шаг 2: Подключение софтпотов к ESP32

Подключение софтпотов к ESP32
Подключение софтпотов к ESP32

Прежде всего нам нужно подключить наши софтпоты к esp32. Подключаем левый и правый контакты к 5V и GND соответственно. Мы подключаем средний вывод к аналоговому выводу на ESP32. Нам также нужно подключить средний контакт с сопротивлением 10 кОм и подключить его к 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 = миллис ();

Serial.begin (115200);

Serial.println («Запуск программы»);

pinMode (SOFT_POT_PIN1, ВХОД);

pinMode (SOFT_POT_PIN2, ВХОД);

pinMode (SOFT_POT_PIN3, ВХОД);

pinMode (SOFT_POT_PIN4, ВХОД); }

void getdata (byte pdata ) {

// Считываем значение АЦП мягкого пота

Затем нам нужно прочитать наши пины, чтобы мы могли получить наши данные.

int softPotADC1 = аналоговое чтение (SOFT_POT_PIN1);

nt softPotADC2 = аналоговое чтение (SOFT_POT_PIN2);

int softPotADC3 = аналоговое чтение (SOFT_POT_PIN3);

int softPotADC4 = аналоговое чтение (SOFT_POT_PIN4);

Затем мы помещаем значения в список, чтобы мы могли легко вывести его позже.

for (int i = 0; i <4; i ++) {

int Names = {softPotADC1, softPotADC2, softPotADC3, softPotADC4};

int softpot = Имена [я];

if (softpot> 10) {

pdata [0] = я;

pdata [1] = softpot;

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

} } }

}

Шаг 3. Беспроводное подключение ESP32 и RPI

Для беспроводного подключения ESP32 и RPI мы будем использовать библиотеку под названием websocket. Чтобы установить эту библиотеку, мы можем получить файлы здесь. Нам нужно будет изменить код в самих файлах, чтобы использовать эту библиотеку для ESP32.

Нам нужно будет изменить MD5.c и MD5.h.

  • MD5Init в MD5InitXXX
  • MD5Update до MD5UpdateXXX
  • MD5Final в MD5FinalXXX

Нам также нужно будет удалить строки avr / io.h в файлах sha1.

Затем мы можем добавить библиотеку в нашу среду разработки Arduino с помощью эскиза> включить библиотеку> добавить библиотеку. ZIP, а затем выбрать вашу библиотеку в zip-файле.

После этого мы можем приступить к написанию нашего кода.

Сначала для ESP32:

Включая нашу библиотеку

#include #include

Снова назначаем наши булавки.

const int SOFT_POT_PIN1 = 34;

const int SOFT_POT_PIN2 = 35;

const int SOFT_POT_PIN3 = 32;

const int SOFT_POT_PIN4 = 33;

Назначение нашего сервера Wi-Fi

Сервер WiFiServer (80);

Запуск нашего веб-сервера

WebSocketServer webSocketServer;

Назначение нашего SSID и пароля вашего Wi-Fi

const char * ssid = "ваш SSID Wi-Fi";

const char * password = "ваш пароль Wi-Fi";

void setup () {

Настройка монитора последовательного порта

Serial.begin (115200);

Настройка ваших софтпотов

pinMode (SOFT_POT_PIN1, ВХОД);

pinMode (SOFT_POT_PIN2, ВХОД);

pinMode (SOFT_POT_PIN3, ВХОД);

pinMode (SOFT_POT_PIN4, ВХОД);

Запускаем наш Wi-Fi и подключаемся к нему

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

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

задержка (1000);

Serial.println («Подключение к WiFi..»); }

Serial.println («Подключен к сети Wi-Fi»);

Serial.println (WiFi.localIP ());

server.begin (); задержка (100); }

void getdata (char * pdata) {

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

// Считываем значение АЦП мягкого пота

int softPotADC1 = аналоговое чтение (SOFT_POT_PIN1);

int softPotADC2 = аналоговое чтение (SOFT_POT_PIN2);

int softPotADC3 = аналоговое чтение (SOFT_POT_PIN3);

int softPotADC4 = аналоговое чтение (SOFT_POT_PIN4);

Помещение данных в список и преобразование его в шестнадцатеричный.

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

}

void loop () {

Подключение вашего клиента (rPI)

WiFiClient client = server.available ();

if (client.connected ()) {

задержка (10);

if (webSocketServer.handshake (client)) {

Serial.println («Клиент подключен»);

Отправка и получение данных.

while (client.connected ()) {

символьные данные [30];

getdata (данные);

Serial.println (данные);

webSocketServer.sendData (данные);

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

Serial.println («Клиент отключился»);

задержка (100); }

еще {

Serial.println ("shitsfuckedyo");

} } }

Затем для rPI в python:

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

импортировать время websocketimport

Назначение глобальной переменной i

я = 0

Установка максимум 200 сообщений, которые мы можем получить

nrOfMessages = 200

класс Websocket ():

def _init _ (сам):

Инициализация нашего веб-сокета и подключение его к нашему ESP32

self.ws = websocket. WebSocket ()

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

Получение наших данных

def работа (сам):

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

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

Закрытие веб-сокета после получения всего

def close (self):

self.ws.close ()

Шаг 4: Подключение вашего веб-сайта и базы данных

Что касается подключения нашей базы данных и веб-сайта, вам в первую очередь необходимо создать свою базу данных на pi, установив 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 ()

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

пытаться:

печать (sql)

курсор.execute (sql, параметры)

кроме исключения как e:

печать (е)

вернуть ложь

результат = cursor.fetchall ()

данные =

для строки в результате:

data.append (список (строка))

cursor.close ()

conn.close ()

вернуть данные

Функция для вставки данных в нашу базу данных

def set_data (sql, params = None):

conn = mysql.connect ()

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

пытаться:

log.debug (sql)

курсор.execute (sql, параметры) conn.commit ()

log.debug ("SQL uitgevoerd")

кроме исключения как e:

log.exception ("Fout bij uitvoeren van sql: {0})". format (e))

вернуть ложь

cursor.close ()

conn.close ()

вернуть True

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

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

def _init _ (себя,):

Настройка потока

threading. Thread._ init _ (сам)

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

self.data_all =

def run (self):

время сна (5)

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

импорт receive_websocket

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

w = получить_websocket. Websocket ()

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

для i в диапазоне (0, 200):

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

печать (self.data_all)

task = ThreadedTask ()

Затем вы можете выполнить task.run (), чтобы запустить поток и начать получать данные.

Шаг 5: соединяем все вместе

Соединяем все вместе
Соединяем все вместе

Для запуска вашего сайта с Pi вы должны использовать сервис:

[Unit] Описание = экземпляр uWSGI для обслуживания веб-интерфейса проекта 1

После = network.target

BindsTo = mysqld.service

After = mysqld.service

[Услуга]

Измените на своего пользователя

Пользователь = пи

Группа = www-data

Здесь вам нужно ввести каталог вашего файла Flask.

Рабочий каталог = / 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] module = web: app virtualenv = / home / pi / project1 / env

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

плагины = python3

socket = project1.sock chmod-socket = 660 вакуум = истина

умереть на срок = правда

Теперь вы можете читать свои данные и отображать их на своем веб-сайте.

Шаг 6: Дополнительно: подключение ЖК-экрана

Дополнительно: Подключение ЖК-экрана
Дополнительно: Подключение ЖК-экрана
Дополнительно: Подключение ЖК-экрана
Дополнительно: Подключение ЖК-экрана
Дополнительно: Подключение ЖК-экрана
Дополнительно: Подключение ЖК-экрана

Мы можем подключить ЖК-экран, чтобы показывать ip-адрес нашего Pi для нашего веб-сайта.

импортировать RPi. GPIO как GPIO импортировать время

команды импорта

GPIO.cleanup ()

D0 = 22

D1 = 5

D2 = 6

D3 = 13

D4 = 19

D5 = 26

D6 = 20

D7 = 21

list = [22, 5, 6, 13, 19, 26, 20, 21]

E = 24

RS = 23

класс Экран:

def _init _ (сам):

GPIO.setmode (GPIO. BCM)

self.setup ()

#Function set self.stuur_instructie (0x3f) #Display self.stuur_instructie (0x0c) #On + cursor self.stuur_instructie (0x01) @staticmethod def setup (): GPIO.setup (list, 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 (self, char):

temp = ord (символ)

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 (self, byte):

для i в диапазоне (0, 8):

если (байт & (2 ** я)) == 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)

для letter2 в teken2:

s.stuur_teken (письмо2)

if _name_ == '_main_': # Программа начинается отсюда

пытаться:

главный()

кроме KeyboardInterrupt:

проходить

Затем мы можем создать службу для запуска ЖК-дисплея при запуске.

Рекомендуемые: