DIY: Робот-подводная лодка для исследования акватории Москвы-реки. Часть 1 / Блог компании Golf Robotics / Хабр

DIY: Робот-подводная лодка для исследования акватории Москвы-реки. Часть 1 / Блог компании Golf Robotics / Хабр Роботы

Как сделать доступный и простой автопилот для diy-проектов из andoid телефона и 70 строк кода?

DIY: Робот-подводная лодка для исследования акватории Москвы-реки. Часть 1 / Блог компании Golf Robotics / Хабр

Код автопилота
import math,android,time
coordmas = [[55.671110, 37.686625],[55.668448, 37.675467],[55.660847, 37.671776],[55.654649, 37.671175]]
droid = android.Android()
droid.startSensingTimed(1,200)
droid.startLocating(5000, 30)
def getgps():
	locs = droid.getLastKnownLocation()
	gpspos = locs.result["gps"]
	return gpspos
def distazim(llat1,llong1,llat2,llong2):
	rad=6372795
	#врадианах
	lat1=llat1*math.pi/180.
	lat2=llat2*math.pi/180.
	long1=llong1*math.pi/180.
	long2=llong2*math.pi/180.
	cl1=math.cos(lat1)
	cl2=math.cos(lat2)
	sl1=math.sin(lat1)
	sl2=math.sin(lat2)
	delta=long2-long1
	cdelta=math.cos(delta)
	sdelta=math.sin(delta)
	y=math.sqrt(math.pow(cl2*sdelta,2) math.pow(cl1*sl2-sl1*cl2*cdelta,2))
	x=sl1*sl2 cl1*cl2*cdelta
	ad=math.atan2(y,x)
	dist=ad*rad
	x=(cl1*sl2)-(sl1*cl2*cdelta)
	y=sdelta*cl2
	z=math.degrees(math.atan(-y/x))
	if(x<0):
		z=z 180.
	z2=(z 180.)60.-180.
	z2=-math.radians(z2)
	anglerad2=z2-((2*math.pi)*math.floor((z2/(2*math.pi))))
	angledeg=(anglerad2*180.)/math.pi
	return [dist,angledeg]
def servoangle(azdiff):
	if azdiff>10 or azdiff<-10:
		deg=azdiff
		if deg>90:
			deg=90
		if deg<-90:
			deg=-90
	return deg
gpspos=getgps()
oldlat = gpspos["latitude"]
oldlon = gpspos["longitude"]
for c in range(len(coordmas)):
	#получение координат текцщей целевой точки
	curcoord=coordmas[c]
	targetlat=curcoord[0]
	targetlon=curcoord[1]
	darange=11;
	while darange>10:
		gpspos=getgps()
		curlat = gpspos["latitude"]
		curlon = gpspos["longitude"]
		time.sleep(0.5)
		da=distazim(curlat,curlon,targetlat,targetlon)
		darange = da[0]
		dazimut = round(da[1])
		pol=droid.sensorsReadOrientation()
		pol2=pol.result
		turn = round(pol2[0])
		turn = (-turn) *180/ 3.2
		azdiff=turn-dazimut
		deg=servoangle(azdiff)
	oldlat = curlat
	oldlon = curlon

Код с комментариями

import math,android,time

#Массив координат
coordmas = [[55.671110, 37.686625],[55.668448, 37.675467],[55.660847, 37.671776],[55.654649, 37.671175]]

#Инициализация, запуск GPS, сенсоров
droid = android.Android()
droid.startSensingTimed(1,200)
droid.startLocating(5000, 30)

#Функции
#GPS
def getgps():
	locs = droid.getLastKnownLocation()
	gpspos = locs.result["gps"]
	return gpspos
#Функция определения расстояния и азимута между двумя GPS-точками
def distazim(llat1,llong1,llat2,llong2):
	rad=6372795
	#врадианах
	lat1=llat1*math.pi/180.
	lat2=llat2*math.pi/180.
	long1=llong1*math.pi/180.
	long2=llong2*math.pi/180.

	#косинусыисинусыширотиразницыдолгот
	cl1=math.cos(lat1)
	cl2=math.cos(lat2)
	sl1=math.sin(lat1)
	sl2=math.sin(lat2)
	delta=long2-long1
	cdelta=math.cos(delta)
	sdelta=math.sin(delta)

	#вычислениядлиныбольшогокруга
	y=math.sqrt(math.pow(cl2*sdelta,2) math.pow(cl1*sl2-sl1*cl2*cdelta,2))
	x=sl1*sl2 cl1*cl2*cdelta
	ad=math.atan2(y,x)
	dist=ad*rad

	#вычислениеначальногоазимута
	x=(cl1*sl2)-(sl1*cl2*cdelta)
	y=sdelta*cl2
	z=math.degrees(math.atan(-y/x))

	if(x<0):
	z=z 180.

	z2=(z 180.)60.-180.
	z2=-math.radians(z2)
	anglerad2=z2-((2*math.pi)*math.floor((z2/(2*math.pi))))
	angledeg=(anglerad2*180.)/math.pi

	return [dist,angledeg]

def servoangle(azdiff):
	if azdiff>10 or azdiff<-10:
		deg=azdiff
		if deg>90:
			deg=90
		if deg<-90:
			deg=-90
	return deg

#принятие текущего положения за старую точку
gpspos=getgps()
oldlat = gpspos["latitude"]
oldlon = gpspos["longitude"]

#Цикл
for c in range(len(coordmas)):
	#получение координат текцщей целевой точки
	curcoord=coordmas[c]
	targetlat=curcoord[0]
	targetlon=curcoord[1]

	#выполняем цикл пока расстояние больше 10 метров до след.точки
	darange=11;
	while darange>10:
		#определение координат	
		gpspos=getgps()
		curlat = gpspos["latitude"]
		curlon = gpspos["longitude"]
		time.sleep(0.5)
		#сравнение дальности и азимута до след. точки.
		da=distazim(curlat,curlon,targetlat,targetlon)
		darange = da[0]
		dazimut = round(da[1])
		#определяем угол телефона
		pol=droid.sensorsReadOrientation()
		pol2=pol.result
		turn = round(pol2[0])
		#[1.57=left, 0=stop, -1.57=right]
		turn = (-turn) *180/ 3.2
		#если угол точки отличается от угла телефона на 10 градусов готовим команду на поворот
		azdiff=turn-dazimut
		#готовим данные для угла поворота сервы руля
		deg=servoangle(azdiff)
		#отправляем по блютус угол поворота серво

	#Меняем координаты старой точки, т.к. ожидается смена координат текущей цели
	oldlat = curlat
	oldlon = curlon

Python For Android. Функции, которые я долго искал

Батарея:

droid.batteryStartMonitoring() — началo работы с батареей.

droid.batteryStopMonitoring()

droid.batteryGetHealth() — возвращает состояние батареи (1-неизвестно, 2-хорошее, 3 — перегрев, 4 — мёртвая, 5 — перегрузка, 6 — неизвестный сбой)

Смотрите про коптеры:  Опыт владения Maserati Quattroporte: современное итальянское искусство - КОЛЕСА.ру – автомобильный журнал

droid.batteryGetStatus() — возвращает статус батареи (1 — неизвестно, 2 — заряжается, 3 — разряжается, 4 — не заряжается, 5 — максимальный заряд)

droid.batteryGetTechnology()

droid.readBatteryData() — данные о батарее.

droid.batteryGetTemperature()

droid.batteryGetVoltage()

droid.batteryGetLevel()

Bluetooth:
droid.checkBluetoothState() — проверяет включён ли Bluetooth
droid.toggleBluetoothState() — включает если в скобках True и выключает, если False
droid.bluetoothAccept() — принимает соединение
droid.bluetoothActiveConnections() — проверяет, есть ли подключения
droid.bluetoothGetConnectedDeviceName()
droid.bluetoothMakeDiscoverable() — в скобках можно указать промежуток времени в секундах
droid.bluetoothStop()

Wi-Fi:
droid.checkWifiState() — проверяет включён ли Wi-Fi
droid.toggleWifiState() — включает если в скобках True и выключает, если False
droid.wifiStartScan()
droid.wifiGetScanResults()
droid.wifiGetConnectionInfo()

Другие настройки:
droid.checkAirplaneMode() — проверяет включён ли режим «В самолёте»
droid.checkRingerSilentMode() — проверяет включён ли беззвучный режим
droid.checkScreenOn() — включён ли экран
droid.toggleRingerSilentMode() — включает беззвучный режим
droid.toggleAirplaneMode()
droid.toggleVibrateMode()

Получение информации о настройках:
droid.getMaxMediaVolume()
droid.getMaxRingerVolume()
droid.getMediaVolume()
droid.getRingerVolume()
droid.getScreenBrightness()
droid.getScreenTimeout()
droid.getVibrateMode()

Установка параметров:
droid.setMediaVolume()
droid.setRingerVolume()
droid.setScreenBrightness()
droid.setScreenTimeOut()

В планах:

  • Настройка отправки данных по Bluetooth на arduino.
  • Получение с arduino данных о глубине. Глубину буду измерять ультразвуковым датчиком.
  • Отправка данных о текущем положении и измерений глубины на сервер.
  • Доработка конструкции. Лодка должна быть с нулевой плавучестью, чтобы глубину можно было изменять рулями глубины. Возможно от конструкции подводной лодки придется уйти к надводному аппарату.
  • Тест, тест, тест

P.S.: Почему я решил написать пост до запуска робота? Я хочу найти единомышленников. Если у Вас есть желание — делайте своего робота. Отличный повод собраться на майских праздниках на аквапробег по Москве-реке на роботах! По всем вопросам можете писать мне ВК. Просьба сделать репост, может быть кто-то из Ваших друзей захочет принять участие в аквамарафоне.

Напоминаю:Конкурс роботов-газонокосилок пройдет в Сколково 3 июня. Все желающие могут попробовать себя в робототехнике. По итогам конкурса мы хотим отобрать команду для стартапа. Мы будем делать первый российский коммерческий робот-мульчатор. Ценные призы и подарки для всех участников.

Кораблик для прикормки своими руками – чертеж, этапы сборки

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

Чтобы сделать карповый кораблик своими руками, понадобится:

  • два двигателя (редуктора и хода), которые можно взять от старого кассетного магнитофона;
  • эпоксидная смола;
  • армированная стеклоткань;
  • редуктор для детского автомобиля (коэффициент редукции около 1:75);
  • нержавеющая проволока для антенны;
  • крепежные рейки для двигателей;
  • корпус от пульта управления для ПУ корабликом;
  • четырехлопастной гребной винт в 500 мм из нержавеющей стали;
  • вал винта в 2,5 мм из нержавейки;
  • два барабана для сброса прикормки и грузила.

Купить все детали можно в магазинах или интернете. У двигателя и аккумулятора рабочее напряжение должно быть одинаковым.

Этапы сборки радиоуправляемого катера:

  1. Сборка корабликовНа плотной бумаге выполняется чертеж будущего кораблика.
  2. Эскиз разрезается по линиям среза и сгибается по линиям сгиба. Форма будущему кораблику задана.
  3. Плотная бумага склеивается, и от бортов отрезаются лишние края.
  4. Для придания твердости внутренняя часть бумажной формы заполняется глиной, парафином или пластилином.
  5. Корпус переворачивается кверху дном и вырезается необходимого размера стеклоткань.
  6. Ткань накладывается на корпус, после чего начиная с днища, на нее наносится эпоксидная смола. Обмазывается вся ткань до бортов.
  7. После того как смола высохнет (через 3–4 часа), необходимо посмотреть толщину корпуса. Если он тонкий, то нужно будет нанести еще один слой стеклоткани и обмазать ее эпоксидкой. Как только смола хорошо просохнет, с корпуса убираются изъяны.
  8. На корме устанавливаются деревянные рейки, к которым крепятся двигатели, электроника и антенна. Двигатель с дном катера должен образовывать угол примерно в 10 градусов.
  9. В соответствии с эскизом лодки располагаются и монтируются барабаны.
  10. Кожух двигателя наполовину заливается литолом, после чего в него устанавливается вал винта.
  11. На вал устанавливается гребной винт.
  12. Для приемника и передатчика устройства составляется электрическая схема, на основе которой паяется плата, обеспечивающая в будущем связь между передатчиком и приемником.

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

Важным моментов в процессе изготовления устройства является просчет его водоизмещения. Зависит оно от следующих показателей:

  • радиус действия катера;
  • предполагаемый объем завозимой прикормки;
  • дополнительное оборудование, которым будет оснащен кораблик.

Изменяться водоизмещение может от 2,5 до 12 литров.

Реверсивный

Многие рыболовы заметили, что при применении простого «водяного змея», возникают определенные неудобства. Они связаны с вываживанием пойманной рыбы посредством снасти. Чтобы подтянуть трофей, требовалось прикладывать определенные усилия и постоянно держать под контролем степень натянутости шнура с одномоментной подмоткой. Из-за этого рыбная ловля в любом случае станет гораздо менее комфортной.

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

Чтобы избавиться от перечисленных трудностей, опытные рыбаки разработали конструкцию реверсивного «кораблика». Подобные снасти, при определенных манипуляциях с их управлением, способны изменять траекторию передвижения на противоположную. Так, делая подводку шнура к берегу, влияя на направленность движения самоделки, с учетом все того же водного течения, не возникают большие неудобства.

Возможности реверса обеспечивает дополнительное размещение скобы из металла со специальным колечком. Эту деталь прикрепляют к внешней части маленькой банки плавательного приспособления. Если рассматривать отличия реверсивных изделий от простых моделей, то можно заметить, что во втором случае шнур привязывают именно к подвижному, а не к стационарному кольцу.

В моменты, когда осуществляется запуск мини- «кораблика» на определенную дистанцию, под силой натяга колечко занимает конкретное положение. Благодаря этому предмет отводится от берега. Если же, после поимки подводной добычи или проверки приманки, шнурку дают небольшую слабину, а потом делают резкую натяжку, то случается произвольная перебежка колечка в совершенно противоположную половину скобы.

Как только место расположения крепежа поменяется, вместе с этим меняется и сама траектория передвижения. В итоге судно возвращается к противоположному направлению. Скоба – это один из самых простых и даже примитивных способов обеспечения реверсивного перемещения снасти. Опытные рыболовы разработали и более сложные механизмы, позволяющие изменять ход. Такие разработки основываются в своей работе на силе смещения крепежных точек.

Подобные самоделки требуют более богатого опыта, современного инструмента и подробных проектов/чертежей.

Разобравшись в работе реверсивного кораблика, стоит рассмотреть подробно основные этапы его самостоятельного изготовления.

  1. Чтобы собрать такую конструкцию, понадобится только очень хорошо высушенная древесина, имеющая достаточную подъемную способность. Конечно, ей придается соответствующая форма.
  2. Чтобы заготовка не всплывала из воды, к нижней торцевой части доски прицепляют редан.
  3. Древесную основу обрабатывают олифой, а потом красят масляными красками. При этом подводную часть изделия можно окрасить голубым цветом, а надводную – белым.
  4. В середине доски высверливают дырку с диаметром примерно в 8 мм, чтобы закрепить свинцовый грузик.
  5. В верхнем торце доски, на участке между пружинками, прикрепляют полоску из пробки. Здесь будут храниться мушки.
  6. Пружину можно соорудить из полосок нержавеющей стали толщиной 0,8 мм, шириной – 10 мм и длиной – 320 мм.
  7. Поплавок можно изготовить самому из обычного пенопласта. Его вместе с переключающим компонентом и пружинками потребуется прикрепить к древесному основанию.
  8. Надо взять полоску из нержавейки и из нее соорудить переключатель. Полоска должна иметь толщину в 1 мм.
  9. Скоба-предохранитель может быть сделана из медной проволоки толщиной 2 мм.

Самодельный дрон из подручных материалов

Полностью самодельная конструкция квадрокоптера
Полностью самодельная конструкция квадрокоптера

Сделать квадрокоптер такого типа, с нуля, относительно несложное занятие. Многие его части можно выполнить из подручных материалов. В нем не много элементов конструкции, которые обеспечивают функциональность аппарата:

  1. Несущая рама. Собственно, «корпус», к которому крепятся двигатели с подъемными винтами, аккумуляторы, системы управления, контроллер и подвесное оборудования. Может быть как покупной, так и изготовленной самостоятельно из дерева, ПВХ труб, пластмассы или алюминия. Единственные к ней требования – легкость и прочность.

Конструкция рамы бывает Н и Х образной для четырех винтов, или многолучевой с большим их количеством.

  1. Подъемные винты. Приобретаются уже готовые или изготавливаются самостоятельно. Могут обладать любым количеством лопастей и углами их наклона. Каждый вид конфигурации пропеллера дает свои плюсы и имеет определенные минусы. К примеру, большее количество лопастей приведет и к увеличению расхода батареи, но тяговая функция у них лучше.

В процессе полета, вращение винтов происходит в разных направлениях, чтобы избежать эффекта авто раскрутки аппарата.

Противоположное вращение винтов коптера
Противоположное вращение винтов коптера
  1. Сами двигатели, по количеству лучей квадрокоптера. Мощности каждого из них должно хватать для необходимой скорости раскрутки винта с целью возникновения подъемной силы у дрона. Существуют редукторные, без коллекторные и щеточные варианты. Первые обеспечивают большую скорость раскрутки, но греются в процессе работы. Вторые считаются лучше подходящими для беспилотников. Третий вариант наиболее дешев, но и достаточно часто выходит из строя из-за износа щеток на коллекторе.
  2. Полетный контроллер. Основное управляющее устройство БПЛА. В своей сущности он – мини компьютер, поддерживающий необходимую частоту оборотов на каждом винте, чтобы не допустить перекосов аппарата. Он же управляет процессом перемещения, замедляя винты одной стороны квадрокоптера и ускоряя другую, чтобы добиться небольшого угла наклона дрона в ту сторону, куда требуется произвести движение. Информацию о текущем положении он получает от специализированных сенсоров – GPS, компаса и акселерометра.
    В самодельных конструкциях можно использовать Arduino или любой другой универсальный микроконтроллер с дополнительными модулями необходимых датчиков.
Контроллер полета дрона
Контроллер полета дрона
  1. Электронный регулятор скорости (ESC). Посредник между контроллером и двигателем. Именно он задает необходимое питание для нужной скорости вращения.
  2. Приемник и передатчик. Первый устанавливается в дрон для получения команд от оператора с земли. Второй — в пульт, оснащенный двумя джойстиками, с помощью которых и управляют квадрокоптером. Полученные сигналы преобразуются в команды для контроллера, который уже обеспечивает последовательность действий по их выполнению.
  3. Защита винтов. Казалось бы, второстепенная вещь, но без этого кожуха вокруг пропеллера, при любом столкновении он выйдет из строя.
    Некоторые варианты несущей рамы подразумевают такое расположение винта, которое убережет его при аварийной ситуации. В таких случаях отдельная защита не нужна.
Защиты винтов дрона
Защиты винтов дрона
  1. Аккумуляторная батарея достаточной емкости, чтобы обслуживать питание всех компонентов летательного аппарата в течение требуемого времени. Для этой части устройства очень важен вес, который непосредственно зависит от ее типа. К примеру, литиевый намного легче, сравнительно с аналогичным той же емкости на основе свинца.
  2. Навесное оборудование. Самая «вкусная» часть квадрокоптера. Непосредственно от него зависит сфера применения летательного аппарата. Конечно же, как и для всего установленного, тут важен вес.
    Кроме того, обязательно нужно уделить внимание потребляемой мощности навесным оборудованием, обеспечив необходимую подачу энергии от отдельного источника или увеличив емкость центрального аккумулятора БПЛА.
    В качестве добавочных устройств зачастую используются различный крепеж для транспортировки грузов или видеокамеры с передатчиком изображения.

Строим квадрокоптер. часть 1. детали.

Меня зовут Дмитрий Дударев. Я занимаюсь разработкой электроники и очень люблю создавать различные портативные девайсы. Еще я люблю музыку.

Давным-давно – в апреле или около того, когда весь мир сотрясался от ударов страшного карантина, я решил научиться играть на гитаре. Я взял у друга акустическую гитару и стал осваивать инструмент по урокам из ютуба и табулатурам. Было тяжело. То ли я неправильно что-то делал, то ли плохо старался, то ли в обществе моих предков мелкая моторика вредила размножению. Короче, ничего кроме звуков дребезжащих струн у меня не выходило. Мое негодование усиливала постоянная расстройка струн. Да и окружающим тысячный раз слушать мою кривую Nothing else matters удовольствия не доставляло.

Но в этих муках про главное правило электронщика я не забыл. Если что-то существует, значит туда можно вставить микроконтроллер. Или, хотя бы, сделать портативную электронную модификацию.

Электронная гитара? Хм, интересная идея, подумал я. Но еще лучше, если на этой гитаре я сам смогу научиться играть. В тот же день акустическая гитара отправилась на свалку обратно к другу, а я стал придумывать идею.

Поскольку я у мамы инженер, то первым делом я составил список требований к девайсу.

Что я хочу от гитары?

1)  Я хочу что-то максимально похожее на гитару, т.е. шесть струн и 12 ладов на грифе.

2)  Хочу компактность и портативность. Чтобы можно было брать девайс с собой куда угодно, не заказывая газель для транспортировки.

3)  Устройство должно без плясок с бубном подключаться к чему угодно, от iOS до Windows. Окей-окей, ладно, будем реалистичными – ко всем популярным осям.

4)  Работа от аккумулятора.

5)  Подключение должно производиться без проводов (но раз уж там будет USB разъем для зарядки, то и по проводу пусть тоже подключается)

6)  Ключевой момент – на гитаре должно быть просто учиться играть, без необходимости в долгих тренировках по адаптации кистевых связок. Как это реализовать? Сразу пришла идея оснастить струны и лады светодиодами. Типа, загрузил табулатуры в гитару, а она уже сама показывает, куда ставить пальцы. Т.е. нет такого, что смотришь на экран, потом на гитару, снова на экран, снова на гитару. Вот этого вот всего не надо. Смотришь только на гитару. И там же играешь. Все. Это прям мое.

7)  Хотелось бы поддержки разных техник игры на гитаре: hummer on, pull off, slide, vibrato.

8) Без тормозов. По-научному – чтобы задержка midi-команд не превышала 10мс.

9)  Все должно собираться из говна и палок легко доступных материалов без сложных техпроцессов и дорогой электроники.

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

Разумеется, для мобильных платформ потребуется написать приложение, в котором можно будет выбрать табулатуру для обучения светодиодами, выбрать инструмент (акустика, классика, электрогитара с различными пресетами фильтров, укулеле и т.д.), и воспроизводить звуки.

Существующие аналоги

А надо ли изобретать велосипед? Ведь на всякую гениальную идею почти наверняка найдется азиат, который уже давно все реализовал в «железе», причем сделал это лучше, чем ты изначально собирался. Иду гуглить.

Оказывается, первая цифровая гитара была создана еще в 1981 году, но в народ сильно не пошла из-за хилой функциональности.

Варианты посовременнее, конечно, тоже нашлись.

Вот, например, с айпадом вместо струн или еще одна в форме моллюска:

Однако такого, чтобы выполнялись все мои хотелки – в первую очередь компактность и режим обучения «жми на лампочки» – такого нет. Кроме того, такие midi-гитары нацелены все же на более профессиональную аудиторию. И еще они дорогие.

Значит, приступаем!

Первый прототип

Чтобы проверить жизнеспособность концепции, нужно сначала определиться с элементной базой.

Контроллер берем STM32F042. В нем есть все, что нужно, при стоимости меньше бакса. Кроме беспроводного подключения, но с этим позже разберемся.

Далее. Струны на деке. Для первого концепта решил напечатать пластиковые язычки, закрепить их на потенциометрах с пружинками и измерять углы отклонения.

Так выглядит 3D-модель:

А так живьем:

Тактильное ощущение приятное. Должно сработать.

Для ладов на грифе я заказал на Али вот такие тензорезистивные датчики.

В отличие от разнообразных кнопок, они не щелкают. Плюс есть возможность определять усилие нажатия, а значит, можно реализовать сложные техники вроде slide или vibrato.

Плюс нужен АЦП, чтобы считывать инфу с датчиков и передавать на контроллер.

Пока ждал датчики из Китая, развел плату:

Прежде чем заказывать печать платы, решил дождаться тензорезисторов. И, как оказалось, не зря. Из 80-ти датчиков рабочими оказались только несколько, и то с разными параметрами.

Выглядит, мягко говоря, не так, как заявлено. И чего я ожидал, покупая электронику на Али?..

И тут меня осенило.

Можно ведь применить другой метод детектирования — измерение емкости, как в датчиках прикосновения. Это гораздо дешевле и доступнее. А если правильно спроектировать механику, то можно и усилие определять.

Что ж. Удаляю все, что было сделано

Второй прототип

Итак, тензорезистивные датчики в топку. В качестве сенсорных элементов в этот раз взял небольшие медные цилиндрики, напиленные из проволоки. Для измерения емкости удалось найти дешевый 12-канальный измеритель емкости общего назначения. Он измеряет емкость в масштабах единиц пикофарад, чего должно быть достаточно для схемы измерения усилия, которую я планирую реализовать в следующих модификациях.

Дополнительно на всякий случай повесил на каждый элемент грифа по посадочному месту для кнопки или чего-то подобного. И сделал соответствующие вырезы в плате. Это чтобы можно было не только прикоснуться к цилиндрику, но и прожать его внутрь. Можно будет поэкспериментировать с разными техниками игры.

Решив вопрос подключения множества микросхем измерителя емкости к контроллеру, приступаю к разводке платы.

На этот раз плату удалось заказать и даже дождаться ее изготовления.

После того, как припаял все комплектующие к плате, понял, что конструкция с пластиковыми струнами получается слишком сложной. Поэтому решил пока что повесить на деку такие же сенсорные цилиндрики, но подлиннее.

Два проводочка в нижней части – это я подключил накладку с цилиндриками к уже изготовленной плате. Это временное решение.

Железяка готова. Следующая задача – заставить ее играть.

Софт

Программная часть реализована так:

1. Скачиваем виртуальный синтезатор, который может работать с MIDI устройством и издавать гитарные звуки.

2. Пишем прошивку для контроллера, которая будет опрашивать сенсоры и передавать данные по USB на комп.

3. На стороне компа пишем программу, которая будет получать эти данные, генерировать из них MIDI-пакеты и отправлять их на виртуальный синтезатор из пункта 1.

Теперь каждый пункт подробнее.

Виртуальных синтезаторов под винду с поддержкой MIDI оказалось довольно много. Я попробовал Ableton live, RealGuitar, FL studio, Kontakt. Остановился на RealGuitar из-за простоты и заточенности именно под гитару. Он даже умеет имитировать несовершенства человеческой игры – скольжение пальцев по струнам, рандомизированные параметры извлечения нот.

Чтобы подключить свое приложение к виртуальному синтезатору я сэмулировал виртуальный порт midi, который подключен ко входу синтезатора RealGuitar через эмулятор midi-кабеля. Такая вот многоуровневая эмуляция.

*Мем с ДиКаприо с прищуренными глазами*

В интерфейсе программы я сделал графическое отображение уровня измеряемой емкости для каждого сенсора. Так будет проще подстраивать звучание. Также на будущее добавил элементы управления светодиодами, вибромотором (пока не знаю зачем, но он тоже будет в гитаре), визуализации работы акселерометра и уровня заряда аккумулятора.

Для того чтобы удары по струнам гитары вызывали проигрывание правильных нот, нужно замапить все 72 сенсора на грифе на соответствующую ноту.

Оказалось, что из 72 элементов на 12-ти ладах всего 37 уникальных нот. Они расположены по определенной структуре, так что удалось вместо построения большой таблицы вывести простое уравнение, которое по номеру сенсора выдает номер соответствующей ноты.

Проверяем работу

Похоже, все готово для первого теста. Пилить прутки и паять все 12 ладов мне было лень, поэтому ограничился 8-ю. Момент истины:

IT’S ALIVE! Жизнеспособность концепта подтверждена. Счастью не было предела! Но нельзя расслабляться.

Следующий этап – добавление светодиодов, акселерометра, вибромотора, аккумулятора, беспроводной связи, корпуса и возможности работы без драйверов или программ эмуляции midi на всех популярных платформах.

Светодиоды

По плану гитара должна подсказывать пользователю, куда ставить пальцы, зажигая в этом месте светодиод. Всего нужно 84 светодиода. Тут все просто. Я взял 14 восьмибитных сдвиговых регистров и соединил в daisy chain. STM-ка передает данные в первый регистр, первый – во второй, второй – в третий и т.д. И все это через DMA, без участия ядра контроллера.

Акселерометр

Самый простой акселерометр LIS3D позволит гитаре определить угол своего наклона. В будущем буду это использовать для наложения звуковых фильтров во время игры в зависимости от положения гитары.

Беспроводное соединение

Для беспроводной передачи данных решил поставить ESP32. Оно поддерживает различные протоколы Bluetooth и WI-FI, будет с чем поэкспериментировать (на тот момент я еще не знал, что в моем случае существует только один правильный способ подключения).

Корпус

Одно из ключевых требований к гитаре – портативность. Поэтому она должна быть складной, а значит, электронику деки и грифа нужно разнести на две платы и соединять их шлейфом. Питание будет подаваться при раскрытии корпуса, когда магнит на грифе приблизится к датчику Холла на деке.

Доработка прототипа

Что ж, осталось облачить девайс в приличную одежку.

Я много экспериментировал с различными конструкциями тактильных элементов грифа и рассеивателями для светодиодов. Хотелось, чтобы равномерно светилась вся поверхность элемента, но при этом сохранялась возможность детектирования прикосновения и нажатия на кнопки.

Вот некоторая часть этих экспериментов:

Еще я обратился к другу, который профессионально занимается промышленным дизайном. Мы придумали конструкцию узла сгибания гитары, после чего он спроектировал и напечатал прототип корпуса.

Развожу финальный вариант плат и собираем гитару:

Выглядит почти круто. Но девайс все еще подключается к компу через цепочку эмуляторов, эмулирующих другие эмуляторы.

Превращаем гитару в MIDI-устройство

В новой версии в первую очередь я хотел, чтобы при подключении по USB, гитара определялась как MIDI устройство без всяких лишних программ.

Оказалось, сделать это не так сложно. Все спецификации есть на официальном сайте usb.org. Но все алгоритмы, которые выполнялись на стороне python-приложения, пришлось переписывать на C в контроллер.

Я был удивлен, что оно сразу заработало на всех устройствах. Windows 10, MacOS, Debian 9, Android (через USB переходник). Достаточно просто воткнуть провод и в системе появляется MIDI-устройство с названием «Sensy» и распознается всеми синтезаторами. С айфоном пока протестировать не удалось т.к. нет переходника. Но должно работать так же.

Беспроводной интерфейс

Осталось избавиться от проводов. Правильное решение пришло не сразу, потому что я поленился как следует погуглить. Но в итоге я использовал протокол BLE MIDI, который поддерживается всеми новыми операционками и работает без всяких драйверов прямо как по USB MIDI. Правда, есть вероятность, что на более старых операционках решение не заработает в силу отсутствия поддержки BLE MIDI. Но все тесты с доступными мне девайсами прошли успешно.

Переписанный функционал приложения – т.е. трансляция данных сенсоров в MIDI-данные – занял точнехонько всю память контроллера. Свободными осталось всего 168 байт. Очевидно, кремниевые боги мне благоволили, значит иду в правильном направлении.

Уверен, можно оптимизировать, но это отложу для следующей версии. Хотя, возможно, проще не тратить время и просто взять контроллер потолще. Разница по деньгам – 5 центов. Посмотрим. Все равно нужно будет место для новых фич – обрабатывать техники игры, например. В первую очередь, хочу реализовать slide. Это когда начинаешь играть ноту с определенным зажатым ладом и проскальзываешь рукой по грифу, перескакивая с лада на лад.

Теперь можно проверить работу по беспроводу:

При включении всех светодиодов, гитару можно использовать, если вы заблудились в темной пещере.

Недостатки прототипа

На текущий момент у конструкции есть следующие минусы:

1) На сенсорах нигде не измеряется усилие нажатия. Это влечет за собой три проблемы:

• Постоянно происходят случайные задевания соседних струн как на деке, так и на грифе. Это делает игру очень сложной.

• Все играемые ноты извлекаются с одинаковой громкостью. Большинство подопытных этого не замечают, но хотелось бы более приближенной к настоящей гитаре игры

• Невозможность использовать техники hammer on, pull off и vibrato

2) Светодиоды одноцветные. Это ограничивает наглядность при игре по табулатурам. Хочется иметь возможность разными цветами указывать на различные приемы игры.

3) Форма корпуса не подходит для левшей. С точки зрения софта – я уже реализовал инверсию струн по акселерометру. Но механический лепесток, необходимый для удержания гитары рукой во время игры, поворачивается только в сторону, удобную правшам.

4) Отсутствие упора для ноги. Сейчас при игре сидя нижняя струна почти касается ноги, а это неудобно.

5)  Сустав сгибания гитары требует осмысления и доработки. Возможно, он недостаточно надежен и стабилен.

Время переходить к разработке следующей версии.

Переезжаю на контроллер серии STM32F07. На нем уже 128КБ флэша – этого хватит на любой функционал. И даже на пасхалки останется.

Использовать ESP32 в финальной версии гитары было бы слишком жирно, поэтому я пошел искать что-то более православное. Выбор пал на NRF52 по критериям доступности, наличию документации и адекватности сайта.

Конечно, будут реализованы и три главных нововведения:

– светодиоды теперь RGB,

– на каждом сенсоре грифа будет измерение усилия (тактовые кнопки больше не нужны),

– струны на деке станут подвижными.

На данный момент плата деки выглядит так (футпринт ESP на всякий случай оставил):

Уже есть полная уверенность в том, что весь задуманный функционал будет реализован, поэтому было принято решение о дальнейшем развитии. Будем пилить стартап и выкладываться на Kickstarter 🙂

Проект называется Sensy и сейчас находится в активной разработке. Мы находимся в Питере, сейчас команда состоит из двух человек: я занимаюсь технической частью, мой партнер – маркетингом, финансами, юридическими вопросами.

Скоро нам понадобится наполнять библиотеки табулатур и сэмплов различных инструментов. Если среди читателей есть желающие в этом помочь – пожалуйста, пишите мне в любое время.

Кому интересно следить за новостями проекта – оставляйте почту в форме на сайте и подписывайтесь на соцсети.

Очень надеюсь на обратную связь с комментариями и предложениями!

Спасибо за внимание!

Забавный эпизод из процесса разработки

Сижу отлаживаю NRF52, пытаюсь вывести данные через UART. Ничего не выходит. Проверял код, пайку, даже перепаивал чип, ничего не помогает.

И тут случайно нестандартным способом перезагружаю плату – в терминал приходит буква «N» в ascii. Это соответствует числу 0x4E, которое я не отправлял. Перезагружаю еще раз – приходит буква «O». Странно. Может быть проблема с кварцевым резонатором и сбился baud rate? Меняю частоту в терминале, перезагружаю плату – опять приходит «N». С каждой новой перезагрузкой приходит по новой букве, которые в итоге составляют повторяющуюся по кругу фразу «NON GENUINE DEVICE FOUND».

Что эта NRF-ка себе позволяет? Прошивку я обнулял. Как она после перезагрузки вообще помнит, что отправлялось в предыдущий раз? Это было похоже на какой-то спиритический сеанс. Может, я и есть тот самый NON GENUINE DEVICE?

Залез в гугл, выяснил, что производители ftdi микросхем, которые стоят в USB-UART донглах, придумали способ бороться с китайскими подделками. Виндовый драйвер проверяет оригинальность микросхемы и на лету подменяет приходящие данные на эту фразу в случае, если она поддельная. Очевидно, мой донгл оказался подделкой и переход на другой решил эту проблему.

Снова спасибо китайцам.

Оцените статью
Радиокоптер.ру
Добавить комментарий