Этот проект стал второй и улучшенной версией проекта по созданию роботизированной мусорки на Arduino.
В основе лежит контроллер Arduino Nano, УЗ-дальномер и сервомашинка.
Однако, для уменьшения потребления тока, MadGyver предпринял несколько шагов:
— отключил сигнальные светодиоды на плате контроллера Arduino (перерезанием дорожки),
— отключил DC-регулятор на плате контроллера,- добавил MOSFET-транзистор, при помощи которого отключается питание сервомашинки, в режиме ожидания,
— добавил конденсатор (10V 470-1000 uF) для сглаживания скачка потребления, возникающего при запуске сервомашинки,
— использовал Arduino-библиотеку LowPower для снижения энергопотребления.
Код для Arduino — скетч auto_trashbin2.ino
/*
Created 2017
by MadGyver (AlexGyver)
Wake up every second, get distance
If there is some obstacle, power on servo, turn it, remember time, sleep sequence again
If there is no obstacle and passed more than cap_time, power on servo and close the cap
*/
//-------------------- SETTINGS ----------------------
#define maxH 50 // working distance
#define cap_time 3 // time while cap is open, seconds
#define open_angle 10 // open angle
#define close_angle 155 // close angle
#define debug 0 // debug information (0 off, 1 on)
//-------------------- SETTINGS ----------------------
// --- WIRING ---
#define trigPin 3
#define echoPin 2
#define sensorVCC 4
#define MOSFETpin 6
#define servoPin 5
// --- WIRING ---
#include "LowPower.h" // sleep library
#include <Servo.h> // servo library
Servo servo;
long duration;
byte distance;
unsigned long open_timer;
boolean open_flag;
void setup() {
Serial.begin(9600);
if (debug) Serial.println("system start");
servo.attach(servoPin);
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, 0);
pinMode(MOSFETpin, OUTPUT);
digitalWrite(MOSFETpin, 0);
pinMode(echoPin, INPUT);
pinMode(sensorVCC, OUTPUT);
digitalWrite(sensorVCC, 0); // power off the sensor
open_cap(); // open cap with system start
}
void open_cap() {
if (debug) Serial.println("open");
digitalWrite(MOSFETpin, 1); // power up the servo
delay(1);
servo.write(open_angle); // open cap
delay(1000); // wait servo
digitalWrite(MOSFETpin, 0); // disable servo
open_flag = 1; // remember that cap is open
}
void close_cap() {
if (debug) Serial.println("close");
digitalWrite(MOSFETpin, 1); // power up the servo
delay(1);
servo.write(close_angle); // close cap
delay(1000); // wait servo
digitalWrite(MOSFETpin, 0); // disable servo
open_flag = 0; // remember that cap is closed
}
void loop() {
LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF); // sleep 1 second
digitalWrite(sensorVCC, 1); // power up range sensor
measure(); // first "idle" measure, there are some glitches without it
distance = measure(); // get distance
digitalWrite(sensorVCC, 0); // disable range sensor
if (debug) {
Serial.println(distance);
delay(500);
}
if (distance > 5 && distance < maxH) { // if distance fit the range
open_timer = 0; // reset timer
if (!open_flag) { // if cap is closed
open_cap();
}
} else {
if (open_flag) { // if cap is open
open_timer++; // timer increment
if (open_timer > cap_time) { // if passed more than cap_time after cap was opened
close_cap();
}
}
}
}
// distance measuring function
byte measure() {
digitalWrite(trigPin, 0);
delayMicroseconds(5);
digitalWrite(trigPin, 1);
delayMicroseconds(15);
digitalWrite(trigPin, 0);
duration = pulseIn(echoPin, HIGH);
return (duration / 2) / 29.1;
}
Так же, для программирования, автор советовал использовать визуальный язык программирования XOD.
Ссылки
https://github.com/AlexGyver/EnglishProjects/tree/master/automaticTrashBin_v2
Automatic Trash Bin
По теме
Роботизированная мусорка на Arduino открывается движением руки
Роботизированный мусорный бак и реакция людей
Радиоуправляемый логотип Android-а из бачка для мусора
Arduino
Ардуино что это и зачем?
Arduino, термины, начало работы
Разновидности плат Arduino, а также про клоны, оригиналы и совместимость
КМБ для начинающих ардуинщиков
