- Плата Arduino. x1
- Компьютер(для написания и загрузке кода, а так же мы будем брать с него электричество и общаться с ним). x1
- Провод для соединения компьютера и платы. x1
- Датчик вибраций SW-420.
- Провода. x3
- Есть схемы с внешним источником питания, но можно взять питание и с платы.
Схема:
Скетч:
C сенсором вибраций SW-420 не всё так однозначно, как предыдущими сенсорами, так как он показывает не наличие самой вибрации.. а непосредственно наличие одного толчка. То есть во время вибрации он будет постоянно менять своё значение с LOW на HIGH и обратно. При этом при отсутствии вибрации он с большой долей вероятности будет находиться в состоянии LOW, но так же может и спокойно встать в состояние HIGH.
Рассмотрим что будет если загрузить в наш Arduino стандартный скетч для кнопки:
Файл -> Примеры ->02.Digital->Button;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/* Button Turns on and off a light emitting diode(LED) connected to digital pin 13, when pressing a pushbutton attached to pin 2. The circuit: * LED attached from pin 13 to ground * pushbutton attached to pin 2 from +5V * 10K resistor attached to pin 2 from ground * Note: on most Arduinos there is already an LED on the board attached to pin 13. created 2005 by DojoDave <http://www.0j0.org> modified 30 Aug 2011 by Tom Igoe This example code is in the public domain. http://www.arduino.cc/en/Tutorial/Button */ // constants won't change. They're used here to // set pin numbers: const int buttonPin = 2; // the number of the pushbutton pin const int ledPin = 13; // the number of the LED pin // variables will change: int buttonState = 0; // variable for reading the pushbutton status void setup() { // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); } void loop() { // read the state of the pushbutton value: buttonState = digitalRead(buttonPin); // check if the pushbutton is pressed. // if it is, the buttonState is HIGH: if (buttonState == HIGH) { // turn LED on: digitalWrite(ledPin, HIGH); } else { // turn LED off: digitalWrite(ledPin, LOW); } } |
Этот скетч мы подробно рассмотрели в статье Arduino. Подключение тактовой кнопки. Посмотрим видео процесса:
На следующем видео видно, что когда колебаний нет, то сенсор не меняет своего значения либо с LOW либо с HIGH:
Немного не тот результат я ожидал. Мне хотелось бы, что бы светодиод горел во время наличия вибрации. И гас, когда вибрации нет.
Для этого напишим-поправим скетч:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
const int keyPin = 2; const int ledPin = 13; const int maxcount = 500; int keyState = 0; int count = 0; int oldstat = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(keyPin, INPUT); } void loop(){ keyState = digitalRead(keyPin); if (keyState != oldstat) { count=0; oldstat = keyState; } if (count < maxcount){ digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } if (count<=maxcount+1) { ++count; } delay(1); } |
Сэнсор у нас поп режнему на 2 порту, а LED на 13.
1 2 |
const int keyPin = 2; const int ledPin = 13; |
Дальше я задаю константу, сколько циклов должно пройти не изменив состояние, прежде чем светодиод погаснет:
1 |
const int maxcount = 500; |
выставил 500 циклов, при каждой задержки я делаю паузу в 1 милисекунду. И того получается, что прежде, чем светодиод потухнет не должно менятся состояния сенсора в течении примерно пол секунды.
Дальше задаём переменные:
1 2 3 |
int keyState = 0; int count = 0; int oldstat = 0; |
keyState — текущее состояние сенсора.
oldstat — предыдущее состояние сенсор.
count — в этой переменной будет хранится кол-во циклов без изменения состояния.
Далее устанавливаем состояния штырька с LED на выход, для штырька с сеносором на получение входящих данных.
1 2 3 4 |
void setup() { pinMode(ledPin, OUTPUT); pinMode(keyPin, INPUT); } |
Основной цикл:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void loop(){ keyState = digitalRead(keyPin); if (keyState != oldstat) { count=0; oldstat = keyState; } if (count < maxcount){ digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } if (count<=maxcount+1) { ++count; } delay(1); } |
Сначала берём значение с сенсора:
1 |
keyState = digitalRead(keyPin); |
Далее сравниваем его с предыдущим состоянием сенсора:
1 |
if (keyState != oldstat) { |
если состояния не равны, то есть оно изменилось, тогда
1 |
count=0; |
сбрасываем состояние счётчика, и устанавливаем новое значение:
1 |
oldstat = keyState; |
Далее устанавливаем состояние лампочки:
1 2 3 4 5 6 |
if (count < maxcount){ digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } |
если счётчик так и не превысил максимального значения, которое мы задали в константах. Значит недавно был толчок и лампочку зажигаем, ну или она продолжит гореть. Если же счётчик превысил значение значит толчков не было давно, и мы выключаем лампочку, или продолжаем её держать выключенной.
Далее счётчик, здесь условие, что бы небыло переполнения переменной я ограничил максимальное число count, до maxcount+1 так как всё равно лампочку надо выключить, и мне не интересно сколько уже небыло толчка. А если просто поставить ++count, то переменная очень быстро переполнится и «сбросится» и того у нас получится мигающая лампочка.
1 2 3 |
if (count<=maxcount+1) { ++count; } |
и осталось сделать задержку в 1 милисикунду и всё:
1 |
elay(1); |
Можно смотреть, что получилось:
как видно лампочка теперь не моргает при колебаниях, а постоянно горит пока не закончатся колебания.
Другие статьи по программированию плат Arduino можно посмотреть здесь.
Отличная реализация, красавец. Задолбался искать по инету годный код. А он тут)
Рад, что понравилось.
Сам разбираюсь по тихоньку с этим делом. 🙂 правда я собрал 3д принтер и теперь я больше 3д моделер :)))
Будь добр, подскажи насколько он чувствителен? Будет ли считывать показания при ударе мяча об стену при креплении с обратной стороны той же стены?
Вот если взглянуть на датчик… там такая синенькая колбочка. В ней ездит шарик… судя по ощущениям в середине контак. когда шарик проезжает через контакт идёт срабатывание. Поэтому чувствительность очень зависит от установки. Для мячика и стенки я бы наверно прифигачил это всё на пружинку 🙂 хотя вопрос будет ли пружинка колебаться 🙂 если стенка фонерка … то думаю можно установить так, что бы и без пружинки срабатывало..
Здравствуйте, спасибо за код, он очень помог, но не могли бы подсказать как эте раализовать в FLprog
Посмотрел на FLprog что то оно страшно выглядит. 🙂 может чего нить более няшное? например Ardublock?
а так, я не люблю визуальное программирование. Мне кажется оно травмирует неокрепшую детскую психику. 🙂 как можно променять буквочки на кубики? 🙂
Я конечно понимаю что код более приятный чем визуальное программирование, но я делаю очень большой проект и мне его надо закончить побыстрее. Поэтому если не сложно подскажите пожалуйста как это сделать в flprog. Спасибо за понимание.?
Я тоже не очень люблю визуальное программирование, но я делаю очень большой проект, а сам не профи в программирование. Мне надо закончить побыстрей , поэтому если не сложно помогите всё это сделать в flprog , так как у меня уже половина готова в этой программе. Спасибо!!?
может быть кто-то знает, где можно найти хорошую информацию о этом датчике (типа доклада-реферата)?заранее благодарю за помощь!