Всем привет 🙂 !!!
Собственно рассказ простой. Мой брат связал свою жизнь с AliExpress, и в часности заказал там он себе Arduino UNO, решив собрать на досуге читалку ключей i-button. Ну и вот так выглядел первый вариант, собранный на коленке:
Потом он решил , что неплохо было бы ключи копировать, и я ему купил четыре болванки в магазине «Чип и Дип». В общем всё хорошо, а без кнопок, которыми можно управлять схемой, было очень плохо. И я получил задание — спаять аналоговую клавиатуру с 5-6 кнопками.
Дальше пошёл процесс с картинками:
Нашёл односторонний текстолит.
Вырезал по размеру, пошкурил, очистил от жира.
Проверил печать лазерного принтера, на обычную бумагу. Потом такой же рисунок напечатал на глянцевом листе от какого то журнала.
Наложил рисунок на текстолит и утюгом через газетку на двоечке прогладил.
Отпечаток получился нормальный, только я забыл убрать при печати слой с контурами корпусов кнопок. Пришлось подчищать вручную, ножиком.
Так вот получилась печатная плата. Смыл тонер, просверлил отверстия, залудил проводники.
Ну и вот , что получилось в сборе:
Правда, оказалось, что разъём не нужен 🙁 , выпаял:
При тестировании клавиатуры, оказалось, что вход АЦП у Arduino по какой-то причине не работает, всё время показывает максимальное значение . Там уже брат сам немножко переделал подключение клавиатуры к плате.
Запихал он всё это в корпус от D-Linka :
Вот скетч для Arduino:
#include <LiquidCrystal.h> #include <OneWire.h&> #define pin 10 OneWire ib (pin); LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //------------------------------------------------------------// 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 Обычный // 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00 Метаком (Metakom) открывает как старые так и новые модели 2010-2011 г (обходит все фильтры) //0x01, 0xA9, 0xE4, 0x3C, 0x09, 0x00, 0x00, 0x00 домофоны Элтис (Eltis) - до 90% //0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0x00 домофоны Визит (Vizit) - до 99% // 0x01,0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00 домофоны Cyfral + фильтр и защита // 0x01,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 домофоны Cyfral 70% // 0x01,0x53, 0xD4, 0xFE, 0x00, 0x00, 0x7E, 0x00 cifra/met // 0x01,0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0x00 Univer 1F //0x01,0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0xFF, 0x00 Univer 2F // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 FF byte COD[]= { 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xA9, 0xE4, 0x3C, 0x09, 0x00, 0x00, 0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0x01, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0xD4, 0xFE, 0x00, 0x00, 0x7E, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; String NAME[]= { "Obyknov.", "Met10/11", "Eltis90%", "Visit99%", "Cif/F+Z ", "Cif 70% ", "Cif/Met ", "1F ", "2F ", "FF??? " }; //------------------------------------------------------------ byte addr[8]; byte cod[8]; byte km; int sch; bool mas; String uHex[]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; bool vid=false; //------------------------------------------------------------ char OK[8] = { 0b11111, 0b11111, 0b11011, 0b10011, 0b10001, 0b10011, 0b11011, 0b11111 }; char sb[8] = { 0b00100, 0b01100, 0b00100, 0b00100, 0b00000, 0b00000, 0b00000, 0b00000, }; //--------------------------------------------------SETUP void setup() { Serial.begin(9600); km=0; mas=false; lcd.begin(8, 2); lcd.createChar(0, OK); // lcd.createChar(1, sb); lcd.setCursor(0,0); lcd.print("Key"); lcd.setCursor(0,1); lcd.print("Master"); delay(1000); } String hux(byte g) { byte a; byte b; byte c; byte i; a=0; b=0; for (i=0;i<4;i++) { c=bitRead(g,i); bitWrite(a,i,c); } for (i=4;i 1; } return 0; } int writeCod(byte Data[8]) { // send reset ib.skip(); ib.reset(); // send 0xD1 ib.write(0xD1); // send logical 0 digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); ib.skip(); ib.reset(); ib.write(0xD5); for (byte x = 0; x "); } ib.reset(); // send 0xD1 ib.write(0xD1); //send logical 1 digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); } //-----------------------------------------------------Выбор другого ключа String KeyCode(byte u) { String a; a=NAME[u]; u= u * 7; for (byte x=0; x= 1010) { return 0; } delay(50); a=analogRead(5); if (a = 320) { if ( a<=370) { b= 2; } } while (a 9){km=0;} lcd.setCursor(0,1); lcd.print(KeyCode(km)); sch=0; vid=true; } sch++; if (sch == 10000) { sch=0; lcd.clear(); lcd.setCursor(0,0); lcd.print("Key "); lcd.setCursor(0,1); lcd.print("Master "); lcd.setCursor(7,0); lcd.print(String(km)); vid=false; } if (vid==true) { if (crc==2) { x=0; y=0; for (crc=0;crc7){ x=0; y++; } } vid=false; sch=0; } } if (crc==2) { if (mas == false) { lcd.setCursor(6,0); lcd.print("C"); mas=true; KeyCode(km); } else { lcd.setCursor(6,0); lcd.print(" "); mas=false; } } crc=ib.reset(); if (crc == 0) { return; } //-----------------------------------------------Запись ключа из памяти if (mas == true) { lcd.setCursor(6,0); lcd.print(" "); mas=false; sch=0; lcd.setCursor(0,0); lcd.print("Write "); lcd.setCursor(0,1); lcd.print(" "); cod[7] = ib.crc8(cod, 7); writeCod(cod); delay(500); lcd.setCursor(0,0); lcd.print("OK "); delay(500); while (crc == 1) { crc=ib.reset(); delay(100); } lcd.setCursor(0,0); lcd.print("Key "); lcd.setCursor(0,1); lcd.print("Master "); return; } //-----------------------------------------------Копирование lcd.clear(); lcd.setCursor(0,0); lcd.print("LOAD "); // ib.skip(); ib.reset(); ib.write(0x33); // delay(50); // ib.search (addr); for ( x = 0; x < 8; x++) { addr[x]=ib.read(); Serial.print(addr[x],HEX); } Serial.print("\n"); delay(500); lcd.setCursor(0,0); lcd.print("OK"); x=2; y=0; for (crc=0;crc7){ x=0; y++; } } crc=ib.crc8(addr,7); if (crc != addr[7]) { lcd.setCursor(0,0); lcd.print("Key "); mas=false; lcd.setCursor(0,1); lcd.print("Faled! "); while (ib.reset() == 1) { delay(100); } delay(1000); sch=9999; return; } while (ib.reset() == 1) { delay(100); } lcd.setCursor(0,0); lcd.print("? "); sch=500; crc=0; while (crc == 0) { delay(100); crc=ib.reset(); sch--; if (sch==0){crc=1;} if (key()==1){crc=1;sch=0;} } if (sch != 0) { delay(1000); lcd.setCursor(0,0); lcd.print("Write "); lcd.setCursor(0,1); lcd.print(" "); writeCod(addr); delay(500); lcd.setCursor(0,0); lcd.print("OK "); delay(500); while (ib.reset() == 1) { delay(100); } } //------------------------------------------------------------------------- delay(500); lcd.setCursor(0,0); lcd.print("Key "); lcd.setCursor(0,1); lcd.print("Master "); mas=false; sch=0; lcd.setCursor(7,0); lcd.print(km); }
Делалось всё это в первый раз, поэтому как и полагалось, не стремились к красоте, а гнались за функционалом , поэтому строгий суд тут не уместен
Мини бизнес открываете ? Будете ключи людям копировать 🙂
То же самое я брату предложил. Он сказал, ну его нафиг, это хобби 🙂
А скетч где для Arduino? 🙂
Выложил ))
Что то ардуино не хочеть принимать такой скетч, во первых ошибки, а во вторых что за библиотека такая ,
где такую взяли? может быть ?
Что то ардуино не хочеть принимать такой скетч, во первых ошибки, а во вторых что за библиотека такая One.Wire.h& ,
где такую взяли? OneWire.h может быть ?
Я не автор статьи, но предполагаю, что OneWire.h& это опечатка и имеется ввиду стандартная библиотека OneWire.h
Ребята, здравствуйте!
А есть схема сборки и подключения считывателя ключей, кнопок и дисплея к Ардуино? Спасибо большое за помощь!
Если автор статьи появится… то ответит.
Постараемся что нибудь изобразить )) , давно это было …