roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 15:49

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Подключение геймпада PS2 к ARM'у
СообщениеДобавлено: 27 окт 2008, 00:19 
Не в сети
Аватара пользователя

Зарегистрирован: 14 май 2008, 15:49
Сообщения: 1585
Откуда: Москва
ФИО: Алексей
Собственно, не то, чтобы достижение, но все же )
Седня съездил на Юнону, купил себе подарков - всякого железного хлама. Экспонат номер один - джойстик для плейстейшн 2 за 50 рублей =) Давно уже была идея, что надо сделать внешний контроллер какой-нить удобный для экспериментов всяких.. а тут оно под руку подвернулось так удачно.
Как оказалось, у пс2 простейший протокол, прекрасно описанный в интернете... написал прошивку под арм, на процессинге накатал простенькую утилитку - рисовалку контроллера/обработчик данных. Вот такая вот фигня получилась:
Вложение:
pscprocessing.jpg
pscprocessing.jpg [ 131.19 КиБ | Просмотров: 2276 ]

(там на экране видно, что нажата одна кнопка и джойстик отклонен вправо)
Вложение:
psxarm.jpg
psxarm.jpg [ 164.12 КиБ | Просмотров: 2292 ]


А вот кусок кода под арм(единственная особенность - для ноги PS_DATA надо включить пулап) :
Код:
unsigned char psx_byte(unsigned char psbyte){
unsigned char psdata=0;
int i=0;
   for(i=0;i<8;i++){
      AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, PS_CLK);
      if(psbyte & (1<<i))   AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PS_CMD);
      else AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, PS_CMD);
      wait(1);
      if(AT91F_PIO_IsInputSet(AT91C_BASE_PIOA, PS_DATA)) setbit(psdata, i);
      AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PS_CLK);
      wait(1);
   }
   AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PS_CMD);
   wait(1);
   return psdata;
}

void psx_poll(int cnt){
int i=0;
   for(i=0;i<18;i++){
      psx_data[i]=0;
   }
   AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PS_CMD|PS_CLK);
   AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, PS_ATT);
   wait(1);
   psx_byte(0x01);
   psx_byte(0x42);
   psx_byte(0x00);
   for(i=0;i<cnt;i++){
      psx_data[i] = psx_byte(0x00);
   }
   AT91F_PIO_SetOutput(AT91C_BASE_PIOA, PS_ATT);
}

_________________
У меня в голове опилки и длинные слова меня только огорчают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подключение геймпада PS2 к ARM'у
СообщениеДобавлено: 27 окт 2008, 00:26 
Не в сети

Зарегистрирован: 29 дек 2004, 23:15
Сообщения: 3744
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей
Я заметил у тебя там ЖТАГ подключен? И не понял что именно ты написал на процессинге


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подключение геймпада PS2 к ARM'у
СообщениеДобавлено: 27 окт 2008, 00:33 
Не в сети
Аватара пользователя

Зарегистрирован: 14 май 2008, 15:49
Сообщения: 1585
Откуда: Москва
ФИО: Алексей
Да, подключен.
На процессинге написал то, что видно на экране (вдалеке за геймпадом) на первой фотке. Программка, которая рисует на экране контроллер, раз в какое-то время забирает с микроконтроллера статус-байты геймпада (прямо в том виде, в котором они были с него получены), эти байты парсит и рисует на джойстике его состояние - подсвечивает кнопки, для аналоговых стиков - рисует в какоую сторону и как сильно он наклонен. Это просто заделка на будущее... последнее время все что делаю - стараюсь делать управляемым через ПК, теперь, в частности, со всяких тулзов на процессинге... вот это что-то вроде библиотеки для будущих использований джойстика.

_________________
У меня в голове опилки и длинные слова меня только огорчают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подключение геймпада PS2 к ARM'у
СообщениеДобавлено: 27 окт 2008, 00:48 
Не в сети

Зарегистрирован: 29 дек 2004, 23:15
Сообщения: 3744
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей
Покажи хотябы кусок кода на процессинге для отображения джойстика, просто интересно


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подключение геймпада PS2 к ARM'у
СообщениеДобавлено: 27 окт 2008, 01:01 
Не в сети
Аватара пользователя

Зарегистрирован: 14 май 2008, 15:49
Сообщения: 1585
Откуда: Москва
ФИО: Алексей
Вот код всей софтины. Ничего интересного на самом деле. При желании можно было сделать интереснее - загрузить svg'шку джойстика и подсвечивать объекты в ней... но у меня нету svg'шки такой =)
Код:
import processing.serial.*;

Serial myPort;
String inString;
Integer[] psx_data;
color color_pressed;
color color_unpressed;

void setup(){
  size(640,480);
  psx_data = new Integer[18];
  for(int i=0;i<18;i++)psx_data[i]=0;
  color_unpressed = color(0, 100, 250);
  color_pressed = color(0, 250, 100);
  inString = "";
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 115200);
  myPort.write(97);
  strokeWeight(5);
}

void draw(){
  background(0);
  draw_psx(200,350);
  myPort.write(99);
  delay(10);
}



void draw_psx(int x, int y){
  rectMode(CORNER);
  stroke(120);
  fill(120);
  rect(x,y, 240, 100);
  rectMode(CENTER);
  stroke(0);
  if((psx_data[1] & 16) != 0) fill(color_pressed);
  else fill(color_unpressed);
  ellipse( x + 205, y + 20, 20, 20);
  if((psx_data[1] & 128) != 0) fill(color_pressed);
  else fill(color_unpressed);
  ellipse( x + 185, y + 40, 20, 20);
  if((psx_data[1] & 32) != 0) fill(color_pressed);
  else fill(color_unpressed);
  ellipse( x + 225, y + 40, 20, 20);
  if((psx_data[1] & 64) != 0) fill(color_pressed);
  else fill(color_unpressed);
  ellipse( x + 205, y + 60, 20, 20);
  fill(color_unpressed);
  ellipse( x + 155, y + 70, 40, 40);
  ellipse( x + 85, y + 70, 40, 40);
  stroke(color_pressed);
  line( x + 155, y + 70, x + 155+int(map(~psx_data[2], 0, 255, -20,20)),y + 70+int(map(~psx_data[3], 0, 255, -20,20)));
  line( x + 85, y + 70, x + 85+int(map(~psx_data[4], 0, 255, -20,20)),y + 70+int(map(~psx_data[5], 0, 255, -20,20)));
  stroke(0);
 
  if((psx_data[0] & 16) != 0) fill(color_pressed);
  else fill(color_unpressed);
  rect(x + 35, y + 20, 20, 20);
  if((psx_data[0] & 128) != 0) fill(color_pressed);
  else fill(color_unpressed);
  rect(x + 15, y + 40, 20, 20);
  if((psx_data[0] & 32) != 0) fill(color_pressed);
  else fill(color_unpressed);
  rect(x + 55, y + 40, 20, 20);
  if((psx_data[0] & 64) != 0) fill(color_pressed);
  else fill(color_unpressed);
  rect(x + 35, y + 60, 20, 20);
 
  if((psx_data[0] & 1) != 0) fill(color_pressed);
  else fill(color_unpressed);
  rect(x + 95, y + 35, 20, 10);
  if((psx_data[0] & 8) != 0) fill(color_pressed);
  else fill(color_unpressed);
  rect(x + 145, y + 35, 20, 10);
}

void serialEvent(Serial port){
  char ch = port.readChar();
  if(ch != 13)
    inString = inString + ch;
  else if(ch == 13){
    println(inString);
    String []p = splitTokens(inString, ", ");
    for(int i=0; (i< p.length && i<18); i++)
      psx_data[i] = ~Integer.parseInt(p[i]);
    inString = "";
  }
}


_________________
У меня в голове опилки и длинные слова меня только огорчают.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO