Знали ли вы что можно заставить надпись сделанную простым карандашом на бумаге реагировать на прикосновение?
Очень легко!
Что понадобиться:
Простой карандаш
Резистор: ~1 МОм (один мега ом)
Канцелярская скрепка (металлическая)
Провода
Arduino
Приступаем:
- Нужно припаять к проводу скрепку (или просто обмотать его вокруг скрепки). У вас должно получиться что-то вроде этого:
- Возьмите чистый лист и нарисуйте с краю прямоугольник и хорошенько закрасьте его карандашом — сюда вы прицепите скрепку, которая будет соединяться проводом с Arduino
- Теперь можете что-нибудь нарисовать или написать по-своему усмотрению (необходимо чтобы ваш рисунок был соединен линией с прямоугольником)
Дальше нужно соединить ваш рисунок с Arduino:
Осталось только загрузить программу в Arduino:
// Пин к которому подключен светодиод
int LEDPin = 13;
// Пин который соединен с вашим рисунком
int capSensePin = 2;
// Величина показывает с какого значения определятся
// нажатие на рисунок, это число можно определить экспериментально
int touchedCutoff = 60;
void setup(){
Serial.begin(9600);
// Включаем светодиод
pinMode(LEDPin, OUTPUT);
digitalWrite(LEDPin, LOW);
}
void loop(){
// Если зафиксированно прикосновение, включаем светодиод,
// иначе - выключаем
if (readCapacitivePin(capSensePin) > touchedCutoff) {
digitalWrite(LEDPin, HIGH);
}
else {
digitalWrite(LEDPin, LOW);
}
// Каждые 500 мс отправляем данные в COM-порт
if ( (millis() % 500) == 0){
Serial.print("Capacitive Sensor on Pin 2 reads: ");
Serial.println(readCapacitivePin(capSensePin));
}
}
// Функция readCapacitivePin
// Вход: Номер пина к которому подключен рисунок
// Выход: Число, от 0 до 17, показывающее величину ёмкости на пине
// Когда вы прикасаетесь к пину ( = рисунку)
// это число увеличивается
// Что бы это работало, необходимо подключить
// между пином и питанием (+5v) резистор сопротивлением ~ 1МОм
uint8_t readCapacitivePin(int pinToMeasure){
volatile uint8_t* port;
volatile uint8_t* ddr;
volatile uint8_t* pin;
byte bitmask;
if ((pinToMeasure >= 0) && (pinToMeasure <= 7)){
port = &PORTD;
ddr = &DDRD;
bitmask = 1 << pinToMeasure;
pin = &PIND;
}
if ((pinToMeasure > 7) && (pinToMeasure <= 13)){
port = &PORTB;
ddr = &DDRB;
bitmask = 1 << (pinToMeasure - 8);
pin = &PINB;
}
if ((pinToMeasure > 13) && (pinToMeasure <= 19)){
port = &PORTC;
ddr = &DDRC;
bitmask = 1 << (pinToMeasure - 13);
pin = &PINC;
}
*port &= ~(bitmask);
*ddr |= bitmask;
delay(1);
*ddr &= ~(bitmask);
int cycles = 16000;
for(int i = 0; i < cycles; i++){
if (*pin & bitmask){
cycles = i;
break;
}
}
*port &= ~(bitmask);
*ddr |= bitmask;
return cycles;
}
Вот и всё, небольшие изменения в коде (необходимо определить значение переменной int touchedCutoff под ваш рисунок) и ёмкостной датчик готов!
|