Подключение PS/2 клавиатуры
- Войдите на сайт для отправки комментариев
Ср, 12/04/2017 - 19:30
Подключил клавиатуру PS/2 через 4 контакта к Ардуино Нано в точности как на сайте:
http://skabinsky.ru/?p=882
Ардуино питаю от кроны. Пробовал от блока питания. Сигналы с клавиатуры не приходят. Сменил 4 клавиатуры и ни одна не заработала.
Что может мешать полноценному функционированию?
Например то, что питаете от Кроны. Посмотрите осциллографим напряжение питания.
Проблему решил. Крона была подключена к ардуино, а с него стабильные 5В выходят. В общем симметрично неправильно подключил выводы к клавиатуре. Одну новую ходовую спалил, а все старые живы остались(((
Здравствуйте. Возникла такая идея : объединить компьютерную клавиатуру PS1/2 + ARDUINO UNO + LED PANEL P10 32Х16 пикселей. На клавиатуре набирается текст и выводится на панель. Нажимаю кнопки на клавиатуре и на мониторе порта вижу символы. Посоветуйте новичку как можно выводить текст на светодиодную панель. Наверняка кто-то уже делал подобное. Спасибо.
Начни с того, что научись работать со световой панелью, напиши там хотя бы Hello world!. Потом научись на ней писать то, что передаешь в Сериал. Потом прикрути к этому всему PS/2 клаву и настанет у тебя всеобщее щастье.
Надеемся ваш проект увидеть в теме "проекты".
PS/2 тоже не так прост, как кажется.) Особенно если нужно играться клавиатурными светодиодами или скоростью автоповтора. Не говоря уже об обработчике хитрых scan-кодов.
Здравствуйте. Возникла такая идея : объединить компьютерную клавиатуру PS1/2 + ARDUINO UNO + LED PANEL P10 32Х16 пикселей. На клавиатуре набирается текст и выводится на панель. Нажимаю кнопки на клавиатуре и на мониторе порта вижу символы. Посоветуйте новичку как можно выводить текст на светодиодную панель. Наверняка кто-то уже делал подобное. Спасибо.
Вот и я загорелся программировать led куб из умных пикселей только одной мышкой PS/2. Пока забавно выходит.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Arduino UNO // //////////////////////// // МЫШЬ КОМПЬЮТЕРНАЯ с круглым разъёмом управляет светодиодным кубом #include "Adafruit_NeoPixel.h"// Подключаем библиотеку Adafruit NeoPixel. #include <ps2.h>//библиотеку подключаем для работы с мышью по протоколу ps/2 /////////////////////////////////////////// #define LED_COUNT1 125// Указываем, какое количество пикселей у нашей ленты. #define LED_PIN1 6// Указываем, к какому порту подключен вход ленты DIN. #define k1 5 Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(LED_COUNT1, LED_PIN1, NEO_RGB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой. int x=0;int y=0;int z=0; int r=0;int g=1;int b=0; int k=5;//яркость свечения пикселя из 0 до 255 ступеней int n=150;//единица длительности переключений в мс int v=0;long C=0;//переменные для обработки данных с пикселя boolean flag_A=0;//сигнальный флажёк byte massiv_A[500]={};//массив для хранения записанных картинок-кадров int i=0;//счётчик int j=0;//счётчик int l=0;//счётчик //////////////////////////////////////////// PS2 mouse(4, 5);//к Pin 5 - подключена линия Data (оранжевый провод), а к pin 4 – линия Clock (белый провод),Vcc - синий, GND- зелёный int mstat;//значение указывает на состояние кнопок и направление движения или покоя мыши int mx;//приращение координаты x int my;//приращение координаты y int mz;//приращение координаты z char IM_mouse_flag = 0; // флаг, что у нас включено расширение Intellimouse /* * Инициализация работы с мышкой. * Посылается команда Сброса (Reset it) * затем мышка переводится режим remote mode * так, что мы получаем от неё данные по запросу */ ////////////////////////////////////////////////////////////// void mouse_init() { mouse.write(0xff); // reset mouse.read(); // ack byte mouse.read(); // blank */ mouse.read(); // blank */ mouse.write(0xf0); // remote mode mouse.read(); // ack delayMicroseconds(100); } /////////////////////////////////////////////////////////////// void setup() { for(i=0;i<500;i++){massiv_A[i]=255;}//начальное заполнение массива strip1.begin(); Serial.begin(9600); mouse_init(); /////////////////////////////////////////// // Посылаем 200, 100, 80 mouse.write(0xF3); // set sample rate to... mouse.write(200); // 200 mouse.read(); // ignore ack mouse.write(0xF3); // set sample rate to... mouse.write(100); // 100 mouse.read(); // ignore ack mouse.write(0xF3); // set sample rate to... mouse.write(80); // 80 mouse.read(); // ignore ack mouse.write(0xF2); // get device ID mouse.read(); // ignore ack IM_mouse_flag = (mouse.read() == 0x03); // если подключена мышь с колёсиком } ////////////////////////////////////////////////////////////// void loop() { funkz_cursor(); } /////////////////////////////////////////////////////////////////// void funkz_moise ()//функция запроса данных от мышки { mouse.write(0xeb); // команда на чтение данных mouse.read(); // игнорируем ack mstat = mouse.read();//например,когда мышь неподвижна и кнопки отпущены значение равно 8, при движении по четвертям принимает значения 8,24,40,56 mx = mouse.read();if(mx>127){mx=mx-255;}//меняется в диапазоне -127 +127 my = mouse.read();if(my>127){my=my-255;}//меняется в диапазоне -127 +127 if(IM_mouse_flag) mz = mouse.read();if(mz>7){mz=mz-255;}//меняется в диапазоне -7 +7 } ///////////////////////////////////////////////////////////////// void funkz_cursor ()//функция движения - рисования курсором { funkz_moise (); if(mstat==9||mstat==25||mstat==41||mstat==57){flag_A=1;} if(flag_A==1){strip1.setPixelColor(x+k1*y+k1*k1*z, strip1.Color(k*g,k*r,k*b));}//если левая кнопка кратко нажата курсор оставляет след if(flag_A==0) {strip1.setPixelColor(x+k1*y+k1*k1*z, strip1.Color(0,0,0));}// иначе гашение предыдущего положения курсора /////////////////// if(mx>5){z++;if(z>4){z=4;}} if(mx<-5){z--;if(z<0){z=0;}}//условия присвоения новых значений координат курсора по приращениям if(my>5){y++;if(y>4){y=4;}} if(my<-5){y--;if(y<0){y=0;}}//координат от мыши (ориентация осей z и x систем координат разная) if(mz<0){x++;if(x>4){x=4;}} if(mz>0){x--;if(x<0){x=0;}} /////////////////// if(mx>5||mx<-5||my>5||my<-5||mz>0||mz<0){flag_A=0;} strip1.setPixelColor(x+k1*y+k1*k1*z, strip1.Color(k*1,k*1,k*1)); //включение нового положения курсора(цвет белый) strip1.show(); /////////////////////////////////////////// if(mstat==10||mstat==26||mstat==42||mstat==58){funkz_zapis ();}//загрузка текущего кадра в массив по нажатию правой кнопки if(mstat==12||mstat==28||mstat==44||mstat==60){funkz_ispol ();}//воспроизведение кадров из массива по нажатию средней кнопки-колеса /////////////////////////////////////////// delay(n);//регулировка чуствительности мыши } //////////////////////////////////////////////////////////////// void funkz_ispol ()//функция проигрывания записанных картинок-кадров из массива { for(i=0;i<125;i++){strip1.setPixelColor(i, strip1.Color(0,0,0));}//выключаем все пиксели for(j=0;j<500;j++) { if(massiv_A[j]<125){strip1.setPixelColor(massiv_A[j], strip1.Color(k*g,k*r,k*b));} if(massiv_A[j]==127) { strip1.show();delay(n); for(i=0;i<125;i++){strip1.setPixelColor(i, strip1.Color(0,0,0));}//выключаем все пиксели } if(massiv_A[j]==255){break;} } } ////////////////////////////////////////////////////////////// void funkz_zapis ()//функция записи текущей картинки-кадра { for(i=0;i<125;i++) { C=strip1.getPixelColor(i);if(C!=0){massiv_A[l]=i;l++;} } massiv_A[l]=127;l++;// окончание кадра - число 127 } /////////////////////////////////////////////////////////////Прикольно ... Вот бы мне такой уровень. Респект пытливым умам.
Подскажите пожалуйста как передавать на led-панель 32х16 P10 то что передается в монитор порта arduino uno.
Дак это теперь ты нам должен рассказать в теме "Проекты"
Пять часов упорных переделок скетча, что бы понять что библиотеки сд карты и умных пикселей не работают вместе :)
Пять часов упорных переделок скетча, что бы понять что библиотеки сд карты и умных пикселей не работают вместе :)
Работают :), но ресурсы ограничены.
Вот что значит - фантазия имеется. То паук на сервах, то телега одноколёсная или рисователь.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Arduino UNO // //////////////////////// // МЫШЬ КОМПЬЮТЕРНАЯ с круглым разъёмом управляет светодиодным кубом РЕДАКТОР ДЛЯ СОЗДАНИЯ ЭФФЕКТОВ #include "Adafruit_NeoPixel.h"// Подключаем библиотеку Adafruit NeoPixel. #include <ps2.h>//библиотеку подключаем для работы с мышью по протоколу ps/2 #include <SPI.h> #include <SD.h> /////////////////////////////////////////// const uint8_t PIN_CS = 10;//CS-10;SCK,CLK-13;MISO-12;MOSI-11 подключение выводов платы File myFile; /////////////////////////////////////////// #define LED_COUNT1 125// Указываем, какое количество пикселей у нашей ленты. #define LED_PIN1 6// Указываем, к какому порту подключен вход ленты DIN. #define k1 5 Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(LED_COUNT1, LED_PIN1, NEO_RGB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой. int x=0;int y=0;int z=0; int r=0;int g=1;int b=0; int k=5;//яркость свечения пикселя из 0 до 255 ступеней int n=150;//единица длительности переключений в мс int v=0;long C=0;//переменные для обработки данных с пикселя boolean flag_A=0;//сигнальный флажoк boolean flag_B=0;//сигнальный флажoк byte massiv_A[250]={};//массив для хранения записанных картинок-кадров int i=0;//счётчик int j=0;//счётчик int l=0;//счётчик int m=0;//счётчик числа элементов массива String inputString="";//переменная хранения строки //////////////////////////////////////////// PS2 mouse(4, 5);//к Pin 5 - подключена линия Data (оранжевый провод), а к pin 4 – линия Clock (белый провод),Vcc - синий, GND- зелёный int mstat;//значение указывает на состояние кнопок и направление движения или покоя мыши int mx;//приращение координаты x int my;//приращение координаты y int mz;//приращение координаты z char IM_mouse_flag = 0; // флаг, что у нас включено расширение Intellimouse /* * Инициализация работы с мышкой. * Посылается команда Сброса (Reset it) * затем мышка переводится режим remote mode * так, что мы получаем от неё данные по запросу */ ////////////////////////////////////////////////////////////// void mouse_init() { mouse.write(0xff); // reset mouse.read(); // ack byte mouse.read(); // blank */ mouse.read(); // blank */ mouse.write(0xf0); // remote mode mouse.read(); // ack delayMicroseconds(100); } /////////////////////////////////////////////////////////////// void setup() { for(i=0;i<250;i++){massiv_A[i]=255;}//начальное заполнение массива pinMode(10, OUTPUT); strip1.begin(); Serial.begin(9600); mouse_init(); SD.begin(PIN_CS); funkz_schtenie_SD ();// считываем эффект записанный в файле SD.remove("NUMPIC.txt");//!!!! при повторном запуске скетча данные эффекта стираются, из файла "NUMPIC.txt" для сохранения эффект надо повторно записать /////////////////////////////////////////// // Посылаем 200, 100, 80 mouse.write(0xF3); // set sample rate to... mouse.write(200); // 200 mouse.read(); // ignore ack mouse.write(0xF3); // set sample rate to... mouse.write(100); // 100 mouse.read(); // ignore ack mouse.write(0xF3); // set sample rate to... mouse.write(80); // 80 mouse.read(); // ignore ack mouse.write(0xF2); // get device ID mouse.read(); // ignore ack IM_mouse_flag = (mouse.read() == 0x03); // если подключена мышь с колёсиком } ////////////////////////////////////////////////////////////// void loop() { funkz_cursor(); } /////////////////////////////////////////////////////////////////// void funkz_moise ()//функция запроса данных от мышки { mouse.write(0xeb); // команда на чтение данных mouse.read(); // игнорируем ack mstat = mouse.read();//например,когда мышь неподвижна и кнопки отпущены значение равно 8, при движении по четвертям принимает значения 8,24,40,56 mx = mouse.read();if(mx>127){mx=mx-255;}//меняется в диапазоне -127 +127 my = mouse.read();if(my>127){my=my-255;}//меняется в диапазоне -127 +127 if(IM_mouse_flag) mz = mouse.read();if(mz>7){mz=mz-255;}//меняется в диапазоне -7 +7 } ///////////////////////////////////////////////////////////////// void funkz_cursor ()//функция движения - рисования курсором { funkz_moise (); if(mstat==9||mstat==25||mstat==41||mstat==57){flag_A=1;} if(flag_A==1){strip1.setPixelColor(x+k1*y+k1*k1*z, strip1.Color(k*g,k*r,k*b));}//если левая кнопка кратко нажата курсор оставляет след if(flag_A==0) {strip1.setPixelColor(x+k1*y+k1*k1*z, strip1.Color(0,0,0));}// иначе гашение предыдущего положения курсора /////////////////// if(mx>5){z++;if(z>4){z=4;}} if(mx<-5){z--;if(z<0){z=0;}}//условия присвоения новых значений координат курсора по приращениям if(my>5){y++;if(y>4){y=4;}} if(my<-5){y--;if(y<0){y=0;}}//координат от мыши (ориентация осей z и x систем координат разная) if(mz<0){x++;if(x>4){x=4;}} if(mz>0){x--;if(x<0){x=0;}} /////////////////// if(mx>5||mx<-5||my>5||my<-5||mz>0||mz<0){flag_A=0;} strip1.setPixelColor(x+k1*y+k1*k1*z, strip1.Color(k*1,k*1,k*1)); //включение нового положения курсора(цвет белый) strip1.show(); /////////////////////////////////////////// if(mstat==10||mstat==26||mstat==42||mstat==58){funkz_zapis ();}//загрузка текущего кадра в массив по нажатию правой кнопки if(mstat==12){funkz_ispol ();}//воспроизведение кадров из массива по нажатию средней кнопки-колеса if(mstat==28||mstat==44||mstat==60){r=!r;g=!g;b=random(0,2);funkz_ispol ();}//воспроизведение кадров из массива по нажатию средней кнопки-колеса со сменой цвета кадров при движениях мышью if(mstat==11||mstat==27||mstat==43||mstat==59){funkz_zapis_SD ();}//запись массива кадров на SD карту по нажатию дублем левой и правой кнопки /////////////////////////////////////////// delay(n);//регулировка чуствительности мыши } //////////////////////////////////////////////////////////////// void funkz_ispol ()//функция проигрывания записанных картинок-кадров из массива { for(i=0;i<125;i++){strip1.setPixelColor(i, strip1.Color(0,0,0));}//выключаем все пиксели for(j=0;j<250;j++) { if(massiv_A[j]<125){strip1.setPixelColor(massiv_A[j], strip1.Color(k*g,k*r,k*b));Serial.print(massiv_A[j]);Serial.print(',');} if(massiv_A[j]==127) { strip1.show();delay(n); for(i=0;i<125;i++){strip1.setPixelColor(i, strip1.Color(0,0,0));}//выключаем все пиксели Serial.print(massiv_A[j]);Serial.print('\n'); } if(massiv_A[j]==255){break;} } x=0;y=0;z=0;//возвращение курсора в исходную точку } ////////////////////////////////////////////////////////////// void funkz_zapis ()//функция записи текущей картинки-кадра { if(flag_B==1){flag_B=0;for(i=0;i<250;i++){massiv_A[i]=255;}l=0;}//разовая первая очистка под новую картинку-кадр for(i=0;i<125;i++) { C=strip1.getPixelColor(i);if(C!=0){massiv_A[l]=i;l++;if(l>249){l=0;}strip1.setPixelColor(i, strip1.Color(0,0,0));} } massiv_A[l]=127;l++;if(l>249){l=0;}// окончание кадра - число 127 strip1.show();x=0;y=0;z=0;//обновление картинки и возвращение курсора в исходную точку } ///////////////////////////////////////////////////////////// void funkz_zapis_SD ()//функция записи массива кадров на карту памяти в текущий и общий файлы { //////////////////////////////////////////////////////////////////////////// m=0;//счётчик числа элементов массива if(massiv_A[0]!=255){ myFile = SD.open("NUMPIC.txt", FILE_WRITE); if(myFile) { while(massiv_A[m]!=255)//пока не дошли до конца данных по пикселям { if(massiv_A[m]<125){myFile.print(massiv_A[m]);myFile.print(',');} if(massiv_A[m]==127){myFile.print(massiv_A[m]);myFile.print('\n');} m++; } myFile.print(255);myFile.print('\n');//символы завершения набора кадров одного эффекта myFile.close(); } } /////////////////////////////////////////////////////////////////////////// m=0;//счётчик числа элементов массива if(massiv_A[0]!=255){ myFile = SD.open("DATMAS.txt", FILE_WRITE); if(myFile) { while(massiv_A[m]!=255)//пока не дошли до конца данных по пикселям { if(massiv_A[m]<125){myFile.print(massiv_A[m]);myFile.print(',');} if(massiv_A[m]==127){myFile.print(massiv_A[m]);myFile.print('\n');} m++; } myFile.print(255);myFile.print('\n');//символы завершения набора кадров одного эффекта myFile.close(); } } ////////////////////////////////////////////////////////////////////////// for(i=0;i<250;i++){massiv_A[i]=255;}l=0;//очистка или начальное заполнение массива программы после записи на карту } ///////////////////////////////////////////////////////////// void funkz_schtenie_SD ()//функция чтения файла с карты в массив данной программы { for(i=0;i<250;i++){massiv_A[i]=255;}l=0;// начальное заполнение массива программы для чтения с карты i=0;// обнулили значение счётчика myFile = SD.open("NUMPIC.txt"); if (myFile) { while (myFile.available()) { char inChar = (char)myFile.read(); if (inChar==','||inChar=='\n'){//если считали символ запятой или переноса строки... int perem=inputString.substring(0).toInt();if(perem==255){goto metka;}massiv_A[i]=(byte)perem;//...преобразовали и занесли в массив предшествующее число i++;inputString="";//увеличили счётчик, обнулили переменную } else { inputString += inChar;//пишем цифры символами в переменную } } metka: myFile.close(); } flag_B=1; } /////////////////////////////////////////////////////////////Пока сделал редактор для эффектов, проигрыватель наверно отдельно буду делать, потому как в одном скетче всего учесть не могу.