Подключение PS/2 клавиатуры

critery
Offline
Зарегистрирован: 12.04.2017

Подключил клавиатуру PS/2 через 4 контакта к Ардуино Нано в точности как на сайте:

http://skabinsky.ru/?p=882

Ардуино питаю от кроны. Пробовал от блока питания. Сигналы с клавиатуры не приходят. Сменил 4 клавиатуры и ни одна не заработала.

Что может мешать полноценному функционированию?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Например то, что питаете от Кроны. Посмотрите осциллографим напряжение питания.

critery
Offline
Зарегистрирован: 12.04.2017

Проблему решил. Крона была подключена к ардуино, а с него стабильные 5В выходят. В общем симметрично неправильно подключил выводы к клавиатуре. Одну новую ходовую спалил, а все старые живы остались(((

VsemDobra
Offline
Зарегистрирован: 24.03.2019

Здравствуйте. Возникла такая идея : объединить компьютерную клавиатуру PS1/2 +  ARDUINO UNO +   LED PANEL P10  32Х16 пикселей.  На клавиатуре набирается текст и выводится на панель. Нажимаю кнопки на клавиатуре и на мониторе порта вижу символы. Посоветуйте новичку как можно выводить текст на светодиодную панель. Наверняка  кто-то уже делал   подобное. Спасибо.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Начни с того, что научись работать со световой панелью, напиши там хотя бы Hello world!.  Потом научись на ней писать то, что передаешь в Сериал.  Потом прикрути к этому всему PS/2 клаву и настанет у тебя всеобщее щастье. 

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Надеемся ваш проект увидеть в теме "проекты".

Green
Offline
Зарегистрирован: 01.10.2015

PS/2 тоже не так прост, как кажется.) Особенно если нужно играться клавиатурными светодиодами или скоростью автоповтора. Не говоря уже об обработчике хитрых scan-кодов.

leks
Offline
Зарегистрирован: 22.10.2017

VsemDobra пишет:

Здравствуйте. Возникла такая идея : объединить компьютерную клавиатуру 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
  }
  /////////////////////////////////////////////////////////////
  

 

VsemDobra
Offline
Зарегистрирован: 24.03.2019

Прикольно ... Вот бы мне такой уровень. Респект пытливым умам.

VsemDobra
Offline
Зарегистрирован: 24.03.2019

Подскажите пожалуйста как передавать на led-панель 32х16 P10 то что передается в монитор порта arduino uno. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Дак это теперь ты нам должен рассказать в теме "Проекты"

leks
Offline
Зарегистрирован: 22.10.2017

Пять часов упорных переделок скетча, что бы понять что библиотеки сд карты и умных пикселей не работают вместе :)

leks
Offline
Зарегистрирован: 22.10.2017

leks пишет:

Пять часов упорных переделок скетча, что бы понять что библиотеки сд карты и умных пикселей не работают вместе :)

Работают :), но ресурсы ограничены.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот что значит - фантазия имеется. То паук на сервах, то телега одноколёсная или рисователь.

leks
Offline
Зарегистрирован: 22.10.2017
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 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;
  }
  /////////////////////////////////////////////////////////////

Пока сделал редактор для эффектов, проигрыватель наверно отдельно буду делать, потому как в одном скетче всего учесть не могу.