К Arduino на закуску: аналоговый акселерометр ADXL335


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

Собственно, о них и хочу упомянуть.



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

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

. Гребеночку уже напаял, да




Поэтому я и сделал выбор в пользу аналогового акселерометра ADXL335 (даташит для любопытных). Ведь с ним можно и память сэкономить, и общаться гораздо проще — достаточно банального analogRead().

Т.е. простейший код для чтения показаний действительно прост, как амеба:

unsigned int x, y, z;

void setup() {
  
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);  
  
Serial.begin(9600);

}

void loop() {
 
  x = analogRead(A0);
  y = analogRead(A1);
  z = analogRead(A2);
  
 Serial.println("xxxx | yyyy | zzzz");
 Serial.print(x, DEC);
 Serial.print(" | ");
 Serial.print(y, DEC);
 Serial.print(" | ");
 Serial.print(z, DEC);
 Serial.println(" | "); 
 delay(2000);
  
}


В итоге пришло ровно то, что на картинке, и я с упоением занялся макетированием, причем сначала — на полноразмерной плате Arduino Mega 2560. И сильно удивился, поскольку поведение акселерометра не очень укладывалось в рамки здравого смысла. Ну, по крайней мере, пока здравый смысл не сказал что-то вроде «окей, даташит я не читал, но будем считать, что акселерометр так и работает».

. Вот крупнее, если не верите, что это ADXL335


Иными словами, я ожидал увидеть на выходах акселерометра значения в диапазоне от 0В до верхнего предела питания, т.е. 3,3В или 5В, поскольку акселерометр работает с обоими, но об этом позже.

Вместо этого вывод в монитор показал примерно следующее. Примерно — потому что у меня не было стенда с идеальными вертикалями и горизонталями. Все вот этими вот руками.

Значения при максимуме по оси X:
X 405
Y 331
Z 344


Значения при минимуме по оси X:
X 268
Y 333
Z 344


Значения при максимуме по оси Y:
Y 400
X 338
Z 346


Значения при минимуме по оси Y:
Y 264
X 334
Z 346


Значения при максимуме по оси Z:
Z 410
X 337
Y 329


Значения при минимуме по оси Z:
Z 275
X 335
Y 331


Показания эти идентичны что для 3В, что для 5В.

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

Второе — упомянутый выше дуализм в смысле питания. Суть в том, что ADXL335 рассчитан на диапазон напряжений от 1,8В до 3,6В. А до 5В его дотянули очень простым способом — поставили стабилизатор на 3,3В ко входу питания.

Решение несколько варварское, поскольку вне зависимости от входного напряжения, пусть даже оно и в допустимых для акселерометра 1,8-3,6В, ток пойдет через стабилизатор. А это довольно критично, если задаться целью сделать максимально экономичное устройство.

На этот случай, как выяснилось, есть более подходящие кандидаты. Именно: макетные платки с питанием от 3,3В или же гибридные, где 5В идет через стабилизатор, а 3,3В — напрямую к чипу. В любом случае, при покупке рекомендую внимательно изучать, что собрались приобретать и соотносить увиденное с желаемым.

Что касается меня, то я решил вопрос со стабилизатором просто. Так как питаться планировал от 3В, то и питающую линию подключил сразу после стабилизатора, и на этом закрыл вопрос.

. Подключился вот в эту точку


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

Выглядит не очень презентабельно, поскольку корпуса — то, что я никогда делать не умел.

. батарейка — для масштаба


.


Ничего, скоро сошью чехольчик, и будет лучше.

А вот так работает макет, где как раз видно работящий акселерометр:



Если интересно, то вот подробнее про «Позиционер».

По итогам общения с акселерометром (конкретно в этой модификации) хочу сообщить следующее. Штука, на мой взгляд, очень хороша для новичков сразу по нескольким причинам:

1) Безопасно для макетных плат с напряжением 3.3В и 5В, поскольку вход питания один и защищен стабилизатором;

2) Стабильность показаний;

3) Просто в использовании за счет аналогового интерфейса — analogRead() и никакой черной магии.

Что касается минусов, то они вытекают из плюсов:

1) Чтобы экономить энергию, придется поработать руками — припаяться напрямую к чипу;

2) Существует возможность поймать помехи на аналоговой линии.

Доклад закончил. Скоро буду писать про шорты брюки.
Планирую купить +21 Добавить в избранное +22 +39
+
avatar
  • yurok
  • 22 июля 2015, 00:21
+7
такое ощущение что обзор не дописан… хоть бы внутренности вашего готового устройства, результаты подпайки… ну и конечно как оно работает и как помогло вам. вот между фразами: «Подключился вот в эту точку» и «Ну а в итоге у меня получилось устройство» — похоже не хватает абзацев 5. Норма что такие значения которые вы получили или нет — непонятно. Что за логика работы контроллера…
+
avatar
  • spc
  • 22 июля 2015, 00:32
0
На самом деле это рассказ про акселерометр. Поэтому в тексте и встречается ссылка про то, что я с ним в итоге сделал.
+
avatar
0
А что есть максимальные и минимальные значения для акселерометра? :-)
+
avatar
  • Serg32
  • 22 июля 2015, 00:26
+1
Думаю, это код что выдает АЦП ATMega, он может быть от 0 до 1023.
+
avatar
  • spc
  • 22 июля 2015, 00:35
0
Это, безусловно, верно, но мне кажется, вопрос был о том, как я эти показания получил :)
+
avatar
  • spc
  • 22 июля 2015, 00:34
0
В данной терминологии — поворот на 180 градусов по каждой оси. Например, для оси Z это как если бы сначала акселерометр лежал пинами гребенки вверх, а потом — вниз.
+
avatar
+2
А если его пнуть? :-)
+
avatar
+3
-Он станет фиолетовым ©
+
avatar
+2
В крапинку? :-)
+
avatar
  • spc
  • 22 июля 2015, 00:57
0
Будет путаться в показаниях. Насколько мне известно, с ними делают даже замочки, которые открываются по тук-тук — тук-тук-тук — тук-тук-тук-тук — тук-тук )
+
avatar
  • kvolk
  • 22 июля 2015, 00:50
+2
Простите но…

… зачем такие обзоры?
+
avatar
  • kvolk
  • 22 июля 2015, 00:53
+1
Тююю… допёрло!
+
avatar
  • spc
  • 22 июля 2015, 00:58
+1
Поэтому я и упомянул про брюки
+
avatar
  • Oregu
  • 22 июля 2015, 01:19
+1
Ну так как интерпретировать показания то? Как я понимаю, если девайс линейно не ускорять, то на него действует наши 9,8g, которые акселерометр будет проецировать на 3 свои оси. Если выставить платку горизонтально и не дёргать, то по двум осям будет ускорение, равное нулю, а по третьей оси — ускорение 9.8g. Вот хотелось бы понять, где у вас ноль, а где почти десятка.
0 = ~ 260 и 10 = ~ 405? т.е. напряжение от 1.3 до 2.025 примерно (если опорное у меги 5 в)?
+
avatar
  • spc
  • 22 июля 2015, 01:36
0
Вы все правильно поняли. Если такой диапазон кажется слишком узким, у Arduino всегда есть функция map, которая позволяет транслировать исходные данные в заданный диапазон.
+
avatar
  • Oregu
  • 22 июля 2015, 01:47
0
Спасибо за ответ. Хотя я немного перепутал — 260 это не ноль а -g, а 405 = +g = 9.8 м/с2… Засыпаю видимо… получается около 7.25 дискрет АЦП на 1 м/с2
+
avatar
  • ploop
  • 22 июля 2015, 08:35
+4
Только не 9.8g, а 1g
+
avatar
0
9.8g это круто :-)
+
avatar
  • ploop
  • 22 июля 2015, 09:46
+1
2-3g это круто! Адреналин! А 9.8 это…

+
avatar
+2
А 9.8g это как-то так:
+
avatar
0
Последняя фотка — 22, емнип
+
avatar
0
Последнее фото — это торможение, судя по щекам и наклону головы.
+
avatar
+4
Как-то катался на Як-52. Сказал пилоту: «А давай-ка по-взрослому». Ну он и дал «мертвую петлю», на выходе которой было 6,5g. Так вот, от неожиданности ручки мои со штурвала свалились, наушнички с головы сползли… Собственно говоря, кроме угасающего сознания перемежающегося с просветами зрения (в такт с ударами сердца) ничего не было. В этот момент я весил почти 650кг, и, скорее всего, имел выражение лица как у товарища на последнем фото))
+
avatar
  • tykhon
  • 22 июля 2015, 02:22
+2
А можно подробней о применении: в чем нежелателен сон на спине? Как эту штуку крепить к телу (скотчем?)? Как предполагается будить спящего на спине негодяя — электрический разряд? Не получится ли пробуждение хуже сна на спине?
+
avatar
  • Kartus
  • 22 июля 2015, 08:45
0
Не получится ли пробуждение хуже сна на спине?
Смотря для кого)))
+
avatar
  • spc
  • 22 июля 2015, 09:05
0
Я сейчас про все отдельным постом, раз пошла такая пьянка )
+
avatar
+1
Как эту штуку крепить к телу (скотчем?)
— да, скотчем к спине, вот теми самыми контактными штырьками к коже — на них долго не полежишь и эффект смены положения обеспечен :-)
+
avatar
  • yurok
  • 22 июля 2015, 17:03
0
заодно и эффект смены кожи и еще несколько забавных эффектов
+
avatar
  • vismyk
  • 22 июля 2015, 06:21
+1
Человек, способный разбудить спящего, способен на любую подлость! © ;) А что можно сказать о человеке, способном создать прибор, способный разбудить спящего? :-D
+
avatar
0
Дак это ж получается, изобретатель первого будильника был жутким подлецом :-)
+
avatar
  • vismyk
  • 22 июля 2015, 07:34
0
Уж садистом-то точно. ;)
+
avatar
  • spc
  • 22 июля 2015, 09:06
0
Ох, ну я бы хотел сказать, что от меня всего можно ожидать, однако это было бы неправдой. Получается, что способен только на такие вот мелкие карманные подлости )
+
avatar
  • I_R_O
  • 22 июля 2015, 07:43
0
и на кого такую штуку будете вешать? :)
+
avatar
  • yurok
  • 22 июля 2015, 08:10
+1
предполагаю — на жену, чтоб она всегда бодрая была и в форме…

не на себе же такие опыты проводить
+
avatar
  • Kartus
  • 22 июля 2015, 08:46
+1
Если жена будет в форме, может и на пятнадцать суток оформить, за неподчинение)))
+
avatar
  • spc
  • 22 июля 2015, 09:07
0
Сначала сам с этим прибором похожу, потом — на полку. Не на кого :)
+
avatar
0
Покупать аналоговый акселерометр и потом его оцифровывать — костыль, происходящий исключительно от нежелания разбираться с I2C или SPI.
С аналоговым акселерометром канонично использовать только теплые ламповые аналоговые операционники и компараторы.
+
avatar
  • spc
  • 22 июля 2015, 09:09
0
Полностью согласен. Но мне нужен был результат, и чем быстрее — тем лучше. Я и так эту штуку очень долго делал, потому что то одно, то другое. И при этом я не из того типа личностей, которые могут тратить бесконечно долгое время, делая все потихоньку, по чуть-чуть.
+
avatar
  • Motto
  • 22 июля 2015, 09:00
0
Когда то хотел на таком акселерометре сделать автоматическое включение ДХО в автомобиле.
Оказалось куча дел.

Получается, чтобы не прозевать кратковременное изменение ускорения, этот акселерометр нужно опрашивать непрерывно?
Тогда Ардуина не сможет ничем больше заниматься.
В цифровых то можно по прерыванию сделать и не опрашивать всё время.
+
avatar
  • vismyk
  • 22 июля 2015, 09:08
+1
На зачем постоянно опрашивать? Достаточно раз в 5 сек, скажем, спросить и если показания от прошлых отличаются, свет включаем, а если, допустим, 20 замеров подряд показания не меняются, значит стоим как вкопанные около пары минут уже и можно свет гасить. Остальное время ардуине можно спать или другими опросами заниматься.
+
avatar
  • ploop
  • 22 июля 2015, 09:40
+1
Тогда Ардуина не сможет ничем больше заниматься.
Жесть. И за что её все любят?
+
avatar
+1
Это такая тонкая ирония? Оценил.
+
avatar
  • ploop
  • 22 июля 2015, 10:24
0
Нет, это не ирония. Это горькая правда жизни. На этом МК космический корабль на Марс запустить можно, но ардуиновские библиотеки доводят до того, что "… не сможет больше ни чем заниматься". Это просто опрос АЦП, одного долбаного АЦП!!!
+
avatar
0
На этом МК космический корабль на Марс запустить можно
Судя по успехам марсианских экспедиций не можно :-)
+
avatar
  • spc
  • 22 июля 2015, 10:52
0
Ну нет, жесть — это писать такой код, чтобы опрос только одного датчика 100% времени. Arduino здесь ни при чем.
+
avatar
0
Включение ДХО от акселерометра? Старик Оккам огорчился бы. Чем не устраивает 15-я линия от замка зажигания? Включено зажигание — горят ДХО, выключено — погасли. Или вы любите ездить с горок с выключенным зажиганием?
+
avatar
0
Лучше с реле отсечки с задержкой
+
avatar
  • Motto
  • 22 июля 2015, 11:47
0
Использую сигналку с автозапуском двигателя и если взять 15-ю шинку замка зажигания, машина ночью будет двор освещать ДХО во время прогрева.
Это надо с ручника еще линию запрета брать, но там минус замыкается, неудобно.

А так удобнее, поехал-включились, встал-выключились, никакой лишней фигни не надо.
+
avatar
  • yurok
  • 22 июля 2015, 17:01
0
в пробке мигать будете всем вокруг, разбавляя скучный простой )

И кстати при прогреве вибрации будут, нужно сильно загрублять чувствительность — что см первый абзац, или гигантские тайминги делать…
+
avatar
  • Motto
  • 22 июля 2015, 17:51
0
Да, по осям шумит сильно. Нужна математическая обработка, типа фильтра Калмана.
+
avatar
0
А так удобнее, поехал-включились, встал-выключились, никакой лишней фигни не надо.
Вернее будет так: ускоряешься или замедляешься — включается, ровное движение — гаснет :)
+
avatar
  • Omega
  • 22 июля 2015, 21:59
0
Возможно не внимательно читал обзор или комменты, но не увидел про то, зачем нужно будить при сне на спине. Могу ошибаться, но некоторые храпят в этой позе. Все бы ничего, но у некоторых из этих некоторых бывает микроостановки дыхания. Попросту говоря иной раз можно и не проснуться. Вроде как в поликлиниках обвешиваются датчиками и во время сна проверяют на наличия этих микроостановки дыхания. Записывался на это, но не пошел. Сам грешу храпом на спине. В роли девайс служит супруга… ну еще помогают капли в нос. Опытным путем остановился на ринонорме. Нос дышит, и просыпаешься не уставшим, как будто марафон пробежал. Девайс делать не буду, тут скорее нужно хирургическое вмешательство. Но это уже личное.
Прошу прощение за оффтоп. Однозначно плюсую! И не важно для меня в чем истинный смысл поделки.
+
avatar
  • spc
  • 22 июля 2015, 22:06
0
Причина была в том, что на поздних сроках беременности в этом положении высокий риск пережатия кровеносной артерии под весом плода, что довольно опасно.

Кстати, мне тоже Ринонорм понравился. Правда, не из-за храпа пока. С другой стороны, я в конечном итоге решил, что мне подходят любые спреи с ксилометазолином.