Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-23 15:05
Как скрипачу я всегда хотел приложение или инструмент, который мог бы очень точно показать мне положение моих пальцев на скрипке. В этом проекте я попытался построить это. Хотя это прототип, и вы все равно можете добавить много функций.
Я также попытался разделить ESP32 и rPI, и поэтому я заставил ESP32 отправлять данные по беспроводной сети на rPi. Это, наверное, самое сложное в этом проекте.
Также очень важно, чтобы в конце этого проекта на вашем компьютере ничего не сохранялось, кроме как на rPI или ESP32.
Шаг 1. Материалы и инструменты
Прежде чем вдаваться в подробности построения этого проекта, нам нужно кое-что.
- 4x Linear Softpot: линейные потенциометры для измерения положения пальца (у скрипки 4 струны)
- ESP32: модуль ESP32 для чтения данных из линейных программных точек.
- Скрипка 4/4: скрипка для размещения линейных мягких горшков сверху.
- Raspberry Pi с SD-картой: Raspberry Pi, в котором будет храниться наша база данных и веб-сайт.
- Потенциометр 10k: потенциометр яркости ЖК-дисплея
- ЖК-экран: ЖК-экран для отображения IP-адреса rPi
- Комплект для пайки: для пайки всех элементов вместе
- Провода «папа-папа» и «папа-мама»: кабели для соединения всех элементов
- Кабель Micro USB: для питания ESP32
Шаг 2: Подключение софтпотов к 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:
проходить
Затем мы можем создать службу для запуска ЖК-дисплея при запуске.
Рекомендуемые:
Датчик положения велосипедной подножки от Magicbit [Magicblocks]: 8 шагов
Датчик положения велосипедной подножки от Magicbit [Magicblocks]: простой проект DIY по созданию датчика положения подножки с Magicbit с использованием Magicblocks. Мы используем magicbit в качестве платы для разработки в этом проекте, основанном на ESP32. Поэтому в этом проекте можно использовать любую плату разработки ESP32
Специальное дозирующее колесо (горшок как датчик положения): 10 шагов
Custom Stering Wheel (горшок как датчик положения): отказ от ответственности: не обвиняйте меня в том, что я не показываю шаг за шагом, это просто ссылка, и я просто говорю, что я сделал, и результат, у него есть некоторые основные недостатки, такие как шум, так что не делай так, как я, и ожидаешь выдающегося результата, и е
Многофункциональные часы с кубом на основе положения: 5 шагов (с изображениями)
Многофункциональные кубические часы на основе положения: это часы на базе Arduino с OLED-дисплеем, которые работают как часы с датой, как таймер дневного сна и как ночник. Различные "функции" контролируются акселерометром и выбираются вращением кубических часов
Повышение безопасности жестких дисков с помощью Arduino и датчика отпечатков пальцев: 6 шагов
Повышение безопасности жестких дисков с помощью Arduino и датчика отпечатков пальцев: в этой статье мы хотим показать вам, как повысить безопасность ваших цифровых данных, хранящихся на жестком диске, с помощью датчика отпечатков пальцев и Arduino. В конце этой статьи вы: узнаете, как использовать датчик отпечатков пальцев. Сделаете надстройку безопасности f
Отслеживание положения сидя и стоя - Имани: 20 шагов
Отслеживание положения сидя и стоя - Имани: Вы хотите следить за своим здоровьем и убедиться, что стоите достаточно каждый день? Тогда Imani - приложение для вас! С помощью одного простого резистора, чувствительного к силе внутри вашей подошвы, мы можем отслеживать ваши ежедневные сидячие и стоячие привычки