Оглавление:
- Шаг 1. Вещи, которые вам понадобятся
- Шаг 2: абстракция
- Шаг 3: основная идея
- Шаг 4: Валабот
- Шаг 5: начало работы
- Шаг 6: Настройка Raspberry Pi - 1
- Шаг 7: Настройка Raspberry Pi - 2
- Шаг 8: Настройка Raspberry Pi - 3
- Шаг 9: Настройка Raspberry Pi - 4
- Шаг 10: Python
- Шаг 11: Для Валабота
- Шаг 12: для сервоинтерфейса
- Шаг 13: для ЖК-дисплея
- Шаг 14: Блинк
- Шаг 15: Настройка приложения Blynk
- Шаг 16. Вы можете использовать этот QR-код с приложением Blynk, чтобы клонировать мой проект, чтобы сэкономить время
- Шаг 17: Запуск Blynk с Raspberry Pi и использование Blynk HTTPS для Python
- Шаг 18: автоматический запуск скрипта
- Шаг 19: Оборудование
- Шаг 20: Дизайн корпуса
- Шаг 21: уколы кишок
- Шаг 22: Окончательные сборочные снимки
- Шаг 23: закрепить Walabot на подставке
- Шаг 24: Аппаратные файлы STL для 3D-печати
- Шаг 25: Схема подключения устройства
- Шаг 26: Код
- Шаг 27: использование репозиториев Github
- Шаг 28: Заключение
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Управляйте своим любимым гитарным эффектом, используя только потрясающие позы гитары!
Шаг 1. Вещи, которые вам понадобятся
Компоненты оборудования
Walabot - Walabot
Raspberry Pi - Raspberry Pi 3, модель B
Sunfounder LCD1602
SunFounder PCA9685 16-канальный 12-битный сервопривод PWM для Arduino и Raspberry Pi
Сервопривод (общий) Нет ссылки
Зажим для батареи 9 В
Держатель батареи 4xAA
Батарейки AA
Провода перемычки (общие)
Педальный переключатель DPDT с фиксацией
Korg SDD3000-PDL
Программные ОС, приложения и онлайн-сервисы
Autodesk Fusion360 -
Блинк -
Инструменты и т. Д
3д принтер
Паяльник
Шаг 2: абстракция
Каково было бы управлять музыкальным выражением, используя только положение вашей гитары в трехмерном пространстве? Что ж, давайте что-нибудь прототипируем и узнаем!
Шаг 3: основная идея
Я хотел иметь возможность управлять тремя параметрами эффекта в реальном времени, я хотел сделать это, используя то, как я расположил свою гитару. Итак, было ясно одно: мне понадобятся несколько вещей.
- Датчик, который видит трехмерное пространство
- Сервоприводы, чтобы повернуть ручки
- ЖК-дисплей
- Драйвер сервопривода I2C
- Raspberry Pi
- Чтобы изучить Python
Шаг 4: Валабот
Хотите видеть сквозь стены? Смысл объектов в трехмерном пространстве? Смысл, если дышишь через всю комнату? Что ж, тебе повезло!
Walabot - это совершенно новый способ измерения пространства вокруг вас с помощью радара малой мощности.
Это должно было стать ключевым в этом проекте, я смогу взять картографические (X-Y-Z) координаты объектов в трехмерном пространстве и сопоставить их с положениями сервопривода, изменяя звучание гитарного эффекта в реальном времени, не касаясь педали.
Победить.
Более подробную информацию о Walabot можно найти здесь
Шаг 5: начало работы
Перво-наперво, вам понадобится компьютер для управления Walabot, для этого проекта я использую Raspberry Pi 3 (здесь упоминается в RPi) из-за встроенного Wi-Fi и общей дополнительной мощности.
Я купил SD-карту на 16 ГБ с предустановленной NOOBS, чтобы все было красиво и просто, и решил установить Raspian в качестве моей ОС Linux.
(если вы не знакомы с тем, как установить Raspian, пожалуйста, найдите время, чтобы немного прочитать это)
Хорошо, как только у вас будет запущен Raspian на вашем RPi, есть несколько шагов по настройке, которые необходимо предпринять, чтобы подготовить все к нашему проекту.
Шаг 6: Настройка Raspberry Pi - 1
Сначала убедитесь, что у вас установлена последняя версия ядра, и проверьте наличие обновлений, открыв командную оболочку и набрав
sudo apt-get update
sudo apt-get dist-upgrade
(sudo добавлен, чтобы гарантировать, что у вас есть административные привилегии, например, все будет работать)
Это может занять некоторое время, так что пойдите и выпейте чашечку чая.
Шаг 7: Настройка Raspberry Pi - 2
Вам необходимо установить Walabot SDK для RPi. В веб-браузере RPi перейдите по адресу https://www.walabot.com/gettingstarted и загрузите установочный пакет Raspberry Pi.
Из командной оболочки:
cd загрузки
sudo dpkg -I walabotSDK_RasbPi.deb
Шаг 8: Настройка Raspberry Pi - 3
Нам нужно начать настройку RPi для использования шины i2c. Из командной оболочки:
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
как только это будет сделано, вы должны добавить следующее в файл модулей
Из командной оболочки:
Судо нано / и т.д. / модули
добавьте эти 2 строки в отдельные строки:
i2c-dev
i2c-bcm2708
Шаг 9: Настройка Raspberry Pi - 4
Walabot потребляет значительную часть тока, и мы также будем использовать GPIO для управления всем, поэтому нам нужно настроить их.
Из командной оболочки:
судо нано /boot/config.txt
добавьте следующие строки в конец файла:
safe_mode_gpio = 4
max_usb_current = 1
RPi - отличный инструмент для производителей, но его возможности для отправки в Walabot ограничены. Поэтому мы добавляем максимальный ток 1 А, а не более стандартные 500 мА.
Шаг 10: Python
Почему Python? ну, так как его очень легко кодировать, быстро запускать и есть множество хороших примеров Python! Я никогда не использовал его раньше, и вскоре он заработал. Теперь RPi настроен для того, что мы хотим, следующим шагом будет настройка Python для доступа к Walabot API, интерфейсам LCD Servo.
Шаг 11: Для Валабота
Из командной оболочки
Sudo pip install «/usr/share/walabot/python/WalabotAPI-1.0.21.zip»
Шаг 12: для сервоинтерфейса
Из командной оболочки
sudo apt-get install git build-essential python-dev
cd ~
git clone
компакт-диск Adafruit_Python_PCA9685
sudo python setup.py установить
Зачем нужен сервопривод? Что ж, у RPi есть пара причин.
1. Ток, потребляемый сервоприводом, может быть очень высоким, и это число тем больше, чем больше у вас сервоприводов (конечно). Если вы управляете сервоприводом напрямую от RPi, вы рискуете взорвать его блок питания.
2. Синхронизация ШИМ (широтно-импульсной модуляции), которая управляет положением сервоприводов, очень важна. Поскольку RPi не использует ОС реального времени (могут быть прерывания и тому подобное), тайминги неточны и могут вызвать нервные подергивания сервоприводов. Специальный драйвер обеспечивает точное управление, но также позволяет добавить до 16 сервоприводов, так что это отлично подходит для расширения.
Шаг 13: для ЖК-дисплея
откройте свой веб-браузер RPi
www.sunfounder.com/learn/category/sensor-k…
скачать
github.com/daveyclk/SunFounder_SensorKit_…
Из командной оболочки:
судо mkdir / usr / share / sunfounder
Используя графический проводник, скопируйте папку python из zip-файла в новую папку sunfounder.
ЖК-дисплей используется для подсказки пользователю, что именно происходит. Отображение процесса настройки до значений x, y и z, отображаемых на каждом сервоприводе
Шаг 14: Блинк
Blynk - это великолепный IoT-сервис, который позволяет вам создавать собственные приложения для управления вашими вещами. Это показалось мне идеальным решением - дать мне дистанционное управление валаботом, чтобы по-настоящему набрать настройки…
Одна проблема. Blynk в настоящее время не поддерживается на платформе Python, буггер. Но не бойтесь! Мне удалось найти небольшую приятную работу, которая позволяет удаленное управление и удаленный ввод параметров! это немного взломано
Первый шаг - загрузить приложение Blynk из вашего любимого магазина приложений.
Во-вторых, зарегистрируйте аккаунт
Как только это будет сделано, откройте приложение и начните новый проект, выбрав Raspberry Pi 3 в качестве оборудования.
Приложение выделит вам токен доступа (он понадобится вам для ввода кода).
Как только вы это сделаете. вам нужно будет настроить приложение, как показано на изображениях. Вот как он будет взаимодействовать с walabot.
Шаг 15: Настройка приложения Blynk
Шаг 16. Вы можете использовать этот QR-код с приложением Blynk, чтобы клонировать мой проект, чтобы сэкономить время
Хорошо. Теперь, когда приложение настроено, мы можем настроить Python и RPi для взаимодействия с ним через Интернет. Магия
Шаг 17: Запуск Blynk с Raspberry Pi и использование Blynk HTTPS для Python
Во-первых, вам необходимо установить оболочку Blynk HTTPS для Python.
Из командной оболочки:
sudo git clone
sudo pip установить blynkapi
Во-вторых, вам нужно установить Blynk Service на RPi
Из командной оболочки:
git clone
cd blynk-библиотека / Linux
очистить все
запустить службу blynk
sudo./blynk --token = YourAuthToken
Чтобы служба Blynk запускалась при запуске, вам необходимо изменить файл /etc/rc.local
при выполнении
sudo nano /etc/rc.local
добавить это в конце
./blynk-library/linux/blynk --token = мой токен &
(я включил копию моего файла /etc/rc.local в раздел кода для справки)
Чтобы проверить, что он работает, просто введите
sudo /etc/rc.local start
Служба Blynk теперь должна работать
Шаг 18: автоматический запуск скрипта
Теперь, когда все это настроено и настроено, и у нас есть готовый код Python. мы можем настроить автоматический запуск, чтобы мы могли отказаться от клавиатуры и мониторов
Есть несколько вещей, которые нужно сделать
Создайте новый файл сценария для запуска программы Python
sudo nano guitareffect.sh
добавить эти строки
#! / bin / sh
python /home/pi/GuitarEffectCLI.py
не забудьте сохранить это
Затем нам нужно дать скрипту разрешение на запуск, набрав
Sudo chmod + x /home/pi/guitareffect.sh
И, наконец, нам нужно добавить этот скрипт в файл /etc/rc.local, с которым мы возились ранее.
Судо нано /etc/rc.local
Добавлять
/home/pi/guitareffect.sh &
не забудьте включить "&", это позволит скрипту Python работать в фоновом режиме.
Верно! Это все, что нужно для конфигурации и программного обеспечения, в следующий раз пора подключить оборудование.
Шаг 19: Оборудование
Первый прототип макета
Шаг 20: Дизайн корпуса
Корпус был спроектирован и визуализирован на великолепном Fusion360.
Шаг 21: уколы кишок
Шаг 22: Окончательные сборочные снимки
Шаг 23: закрепить Walabot на подставке
Используйте самоклеющийся металлический диск, который идет в комплекте с walabot, чтобы закрепить его на месте.
Шаг 24: Аппаратные файлы STL для 3D-печати
Шаг 25: Схема подключения устройства
Шаг 26: Код
Используйте прилагаемый скрипт Python для своего проекта
from _future_ import print_functionfrom sys import platform from os import system from blynkapi import Blynk import WalabotAPI import time import RPi. GPIO as GPIO
# настроить GPIO с помощью нумерации плат
GPIO.setmode (GPIO. BOARD) GPIO.setup (18, GPIO. IN, pull_up_down = GPIO. PUD_UP)
#blynk auth token
auth_token = "your_auth_token_here"
# Импортируйте модуль PCA9685 для сервоуправления.
импорт Adafruit_PCA9685
# импорт ЖК-модуля из местоположения
из imp import load_source LCD1602 = load_source ('LCD1602', '/usr/share/sunfounder/Python/LCD1602.py')
# Инициализировать PCA9685, используя адрес по умолчанию (0x40).
pwm = Adafruit_PCA9685. PCA9685 ()
# blynk объектов
defaults = Blynk (auth_token, pin = "V9") start_button = Blynk (auth_token, pin = "V3") Rmax = Blynk (auth_token, pin = "V0") Rmin = Blynk (auth_token, pin = "V1") Rres = Блинк (auth_token, pin = "V2")
ThetaMax = Blynk (auth_token, pin = "V4")
ThetaRes = Blynk (auth_token, pin = "V5")
PhiMax = Blynk (auth_token, pin = "V6")
PhiRes = Blynk (auth_token, pin = "V7")
Порог = Blynk (auth_token, pin = "V8")
ServoMin = Blynk (auth_token, pin = "V10")
ServoMax = Blynk (auth_token, pin = "V11")
def LCDsetup ():
LCD1602.init (0x27, 1) # init (адрес ведомого, фоновая подсветка)
def numMap (x, in_min, in_max, out_min, out_max): "" "используется для сопоставления показаний Walabot с положением сервопривода" "" return int ((x- in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
# используйте это для округления необработанных данных до назначенного значения
def myRound (x, base = 2): вернуть int (base * round (float (x) / base))
# извлекает число из возвращенной строки blynk
def numberExtract (val): val = str (val) return int (filter (str.isdigit, val))
# Установите частоту 60 Гц, подходит для сервоприводов.
pwm.set_pwm_freq (60)
# Настроить минимальную и максимальную длительность сервоимпульсов по умолчанию
SERVO_MIN = 175 # Мин. Длина импульса из 4096 SERVO_MAX = 575 # Макс. Длина импульса из 4096
# значения по умолчанию для walabot
R_MAX = 60 R_MIN = 20 R_RES = 5
THETA_MAX = 20
THETA_RES = 5
PHI_MAX = 20
PHI_RES = 5
ПОРОГ = 1
# переменные для переключения blynk
on = "[u'1 ']"
класс Walabot:
def _init _ (сам):
self.wlbt = WalabotAPI self.wlbt. Init () self.wlbt. SetSettingsFolder () self.isConnected = False self.isTargets = False
def blynkConfig (сам):
load_defaults = defaults.get_val () if str (load_defaults) == on: SERVO_MAX = ServoMax.get_val () SERVO_MAX = numberExtract (SERVO_MAX) print ("Servo Max =", SERVO_MAX)
SERVO_MIN = ServoMin.get_val ()
SERVO_MIN = numberExtract (SERVO_MIN) print ("Servo MIN =", SERVO_MIN) R_MAX = Rmax.get_val () R_MAX = numberExtract (R_MAX) print ("R max =", R_MAX)
R_MIN = Rmin.get_val ()
R_MIN = numberExtract (R_MIN) print ("R Min =", R_MIN)
R_RES = Rres.get_val ()
R_RES = numberExtract (R_RES) print ("R Res =", R_RES)
THETA_MAX = ThetaMax.get_val ()
THETA_MAX = numberExtract (THETA_MAX) print ("Theta Max =", THETA_MAX) THETA_RES = ThetaRes.get_val () THETA_RES = numberExtract (THETA_RES) print ("Theta Res =", THETA_RES)
PHI_MAX = PhiMax.get_val ()
PHI_MAX = numberExtract (PHI_MAX) print ("Phi Max =", PHI_MAX) PHI_RES = PhiRes.get_val () PHI_RES = numberExtract (PHI_RES) print ("Phi Res =", PHI_RES)
ПОРОГ = Порог.get_val ()
ПОРОГ = numberExtract (THRESHOLD) print ("Threshold =", THRESHOLD)
else: # если ничего из приложения blynk, загрузить значения по умолчанию SERVO_MIN = 175 # Минимальная длина импульса из 4096 SERVO_MAX = 575 # Максимальная длина импульса из 4096
# значения по умолчанию для walabot
R_MAX = 60 R_MIN = 20 R_RES = 5
THETA_MAX = 20
THETA_RES = 5
PHI_MAX = 20
PHI_RES = 5
ПОРОГ = 1
def connect (self): try: self.wlbt. ConnectAny () self.isConnected = True self.wlbt. SetProfile (self.wlbt. PROF_SENSOR) # self.wlbt. SetDynamicImageFilter (self.wlbt. FILTER_TYPE_MTI) self.wlbt. SetProfile (self.wlbt. FILTER_TYPE_NONE) # self.wlbt. SetDynamicImageFilter (self.wlbt. FILTER_TYPE_DERIVATIVE) self.wlbt. SetArenaTheta (-THETA_MAX, THETA_MAX, THETA_RES, PHIRENA_MAX) self.wlbtESX) self.wlbtESX. SetArenaR (R_MIN, R_MAX, R_RES) self.wlbt. SetThreshold (THRESHOLD), кроме self.wlbt. WalabotError как err: if err.code! = 19: # 'WALABOT_INSTRUMENT_NOT_FOUND' поднять ошибку
def start (self):
self.wlbt. Start ()
def калибровка (самостоятельно):
self.wlbt. StartCalibration ()
def get_targets (сам):
self.wlbt. Trigger () return self.wlbt. GetSensorTargets ()
def stop (self):
self.wlbt. Stop ()
def отключить (самостоятельно):
self.wlbt. Disconnect ()
def main ():
flag = True check = "" LCDsetup () while flag: LCD1602.write (0, 0, 'Guitar') LCD1602.write (0, 1, 'Effect Control') time.sleep (2) LCD1602.write (0, 0, 'Press Start to') LCD1602.write (0, 1, 'begin') time.sleep (2) if (str (check) == on): flag = False else: check = start_button.get_val () # проверьте нажатие кнопки запуска blynk if (GPIO.input (18) == 0): #check footswitch flag = False
LCD1602.write (0, 0, «ОК! Давай сделаем это»)
LCD1602.write (0, 1, '') wlbt = Walabot () wlbt.blynkConfig () wlbt.connect () LCD1602.clear (), если не wlbt.isConnected: LCD1602.write (0, 0, 'Not Connected') else: LCD1602.write (0, 0, 'Connected') time.sleep (2) wlbt.start () wlbt.calibrate () LCD1602.write (0, 0, 'Calibrating…..') time.sleep (3)) LCD1602.write (0, 0, 'Запуск Walabot')
appcheck = start_button.app_status () flag = True # сбросить флаг для основной программы
флаг while: # используется для перевода в режим ожидания (эффективно)
if (appcheck == True): if (str (check)! = on): if (GPIO.input (18)! = 0): # проверить флаг педального переключателя = False else: check = start_button.get_val () # проверить наличие нажмите кнопку запуска appcheck = start_button.app_status ()
еще:
if (GPIO.input (18)! = 0): # проверить флаг педального переключателя = False
xval = 0
yval = 0 zval = 0 среднее значение = 2 delayTime = 0
target = wlbt.get_targets ()
если len (цели)> 0:
для j в диапазоне (в среднем):
target = wlbt.get_targets ()
если len (цели)> 0: print (len (цели)) цели = цели [0]
печать (стр (targets.xPosCm))
xval + = int (targets.xPosCm) yval + = int (targets.yPosCm) zval + = int (targets.zPosCm) time.sleep (delayTime) else: print ("нет целей") xval = xval / average
xval = numMap (xval, -60, 60, SERVO_MIN, SERVO_MAX)
xval = myRound (xval), если xval SERVO_MAX: xval = SERVO_MAX LCD1602.write (0, 0, 'x =' + str (xval) + '') pwm.set_pwm (0, 0, xval)
yval = yval / среднее
yval = numMap (yval, -60, 60, SERVO_MIN, SERVO_MAX)
yval = myRound (yval), если yval SERVO_MAX: yval = SERVO_MAX LCD1602.write (0, 1, 'y =' + str (yval)) pwm.set_pwm (1, 0, yval)
zval = zval / среднее
zval = numMap (zval, R_MIN, R_MAX, SERVO_MIN, SERVO_MAX)
zval = myRound (zval), если zval SERVO_MAX: zval = SERVO_MAX LCD1602.write (8, 1, 'z =' + str (zval)) pwm.set_pwm (2, 0, zval)
еще:
print («нет целей») LCD1602.write (0, 0, «Завершение работы») LCD1602.write (0, 1, 'The Walabot') time.sleep (3) wlbt.stop () wlbt.disconnect ()
если _name_ == '_main_':
в то время как True: main ()
для guitareffect.sh
#! / bin / sh
cd / home / pi
sudo python GuitarEffectCLI.py
Копия локального файла RC для справки
#! / bin / sh -e # # rc.local # # Этот сценарий выполняется в конце каждого многопользовательского уровня выполнения. # Убедитесь, что сценарий "выйдет из 0" в случае успеха или # любое другое значение в случае ошибки. # # Чтобы включить или отключить этот скрипт, просто измените бит выполнения #. # # По умолчанию этот скрипт ничего не делает.
# Распечатать IP-адрес
_IP = $ (имя хоста -I) || истина, если ["$ _IP"]; затем printf "Мой IP-адрес% s / n" "$ _IP" fi
./blynk-library/linux/blynk --token = "сюда идет ваш токен" &
спать 10 sudo /home/pi/guitareffect.sh и выйти 0
Шаг 27: использование репозиториев Github
Используйте это для ЖК-дисплея Sunfounder
github.com/daveyclk/SunFounder_SensorKit_f…
Используйте это для сервопривода
github.com/daveyclk/Adafruit_Python_PCA968…
Используйте это для оболочки Blynk Python
github.com/daveyclk/blynkapi
Шаг 28: Заключение
Что ж, это была крутая кривая обучения, но она того стоила.
Мои выводы
- Мне пришлось выучить Python … оказывается, это туз
- Подключил Python на Raspberry Pi к службе Blynk IoT. Это официально не поддерживается, поэтому его функции имеют некоторые ограничения. Тем не менее, все еще отлично работает!
- Оказывается, Walabot отлично подходит для музыкального самовыражения. Я использовал его на Korg SDD3000, но вы можете использовать любой эффект, который вам нравится.
Попробуй сам. Это не ограничивается гитарными эффектами, я могу использоваться с любым инструментом с любым эффектом.
Финалист Raspberry Pi Contest 2017