Из того, что я понял просто изучая интернет:
База опрашивает баранку по SPI. Баранка передает базе 24 бита. Первые несколько бит (возможно 8) - фиксированы. Возможно по ним база определяет что это за баранка. У меня есть образец данных для баранки 458 Italia и есть баранка Ильи, которая отличается по внутренностям, но скорее всего работает аналогично. Осталось спаять переходник и проверить, что именно передает та баранка, которая у меня есть.
После этого я смогу более определенно сказать, нужна ли баранка ф1. Возможно получится просто подобрать идентификатор для нее. Но здесь уже желательно иметь рабочую базу. В общем, подождите немного, скоро будет больше информации.
Платы внутри разные кстати. Вот TX RW, тут все просто и понятно:
А вот внутри баранки Ильи:
Это тайваньский 8-битный OTP контроллер, думаю, самый дешевый, который только можно было найти:
Верхняя баранка видимо как раз 458 Italia, раз они совместимы - значит, протокол должен быть одинаковый. Но есть еще одна нога, которая в верхней баранке не искользуется. Скорее всего это MOSI (Master-Out-Slave-In) и что по ней передается - еще предстоит разобраться.
Green – not used (reserved for MOSI?)
Blue – GND (ground)
White – MISO (master-in-serial-out, this is a serial data line from wheel to base)
Orange – SS (slave select, also called PL – parallel load)
Red – SCK (clock)
Black +VCC (wheelbase uses +3.3V)
Небольшое дополнение:
/*
Ver. 1.03 beta 2016-08-05
This sketch emulates Thrustmaster F1 Wheel addon
allowing to connect arduino (Arduino Pro Mini) to TX RW wheelbase (may work for T500/T300 as well)
and emulate button presses - up to 17 buttons +4 emulated (D-Pad) buttons can be connected to arduino.
!!! There are 2 flavours of arduino boards - powered by +5 volts or +3.3 volts !!!
!!! If you have +5V Arduino version - disconnect it from USB before connecting to a wheelbase !!!
!!! Just power your arduino from TX RW wheelbase Black pin - it supplies +3.3V voltage (should be enough) !!!
!!! don't connect USB +5V wire to TX RW wheelbase Black +3.3V - you'll get a collision !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Tested with Arduino Mini Pro (ATMEGA 328P) at 3V 12MHz !!!
Thrustmaster Wheelbase cable pinout (PS/2 connector, also known as mini-Din 6pin female):
1 - Green - MOSI Don't connect
2 - Blue - GND (ground)
3 - White - MISO (master in, slave out - to read the data from the wheel)
4 - Orange - SS (slave select, or PL - parallel load, set it to 0 when you want to read the data)
5 - Red - CLK (clock impulses)
6 - Black - +VCC (+3.3 volts! if you have Arduino 5V version - use external +3.3V power or use the wheelbase power!!!)
Arduino UNO pins -> TX RW wheelbase cable pins
MISO - used for button 2 Gear Up
Arduino GND -> TWRX Blue wire (2)
Arduino pin 12 (MOSI) -> TXRW White wire (3) (data from wheel to base)
Arduino pin 10 (SS) -> TXRW Orange wire pin (4)
Arduino pin 13 (SCK) -> TXRW Red wire (5)
Arduino +5V -> TXRW Black wire (6) (it gives 3.3V, but must be connected into +5V socket on arduino uno side)
Button mappings
Read out with unpushed buttons
1100 1111 | 1111 1111 | 1111 1111 | 1111 1111 | 0000 0000 | 0000 0000 | 0110 0000 | 0100 0000 |
Byte 1
1-8 5 (DRS) - (A) --> 11 (PortB bit2)
1-7 static 1 ???
1-6 static 0 ???
1-5 static 0 ???
1-4 1 (gear down) - (LB) --> A3 (PortC bit3)
1-3 2 (gear up) - (RB) --> A2 (PortC bit2)
1-2 3 (N) - (X) --> A1 (PortC bit1)
1-1 4 (PIT) - (A) --> A0 (PortC bit0)
Byte 2
2-8 13 (START sw) - (A) --> 7 (PortD bit7) (It has soldered same function up and down)
2-7 6 (10+) - (LB) --> 6 (PortD bit6)
2-6 7 (BO sw) - (VIEW) --> 5 (PortD bit5) (It has soldered same function up and down)
2-5 8 (WET sw) - (MENU) --> 4 (PortD bit4) (It has soldered same function up and down)
2-4 9 (PL) - (B) --> 3 (PortD bit3)
2-3 10 (K) - (Y) --> 2 (PortD bit2)
2-2 11 (PUMP) - (A) --> TX/1 (PortD bit1)
2-1 12 (1-) - (RB) --> RX/0 (PortD bit0)
Byte 3
3-8 21 (BP up) - (Same as D-Pad) (PortC bit6) R1=10K Ohm
3-7 D-pad down - (D-Pad) ------> JOY_X // JOY_X: GND --[====/===]-- Vcc
3-6 D-pad right - (D-Pad) ------> JOY_Y |
3-5 D-pad left - (D-Pad) ------> JOY_Y |A5 (PortC 5) R2=10K Ohm
// JOY_X: GND --[====/===]-- Vcc
3-4 D-pad up - (D-Pad) ------> JOY_X A6 |
3-3 20 (BP down) - (Same as D-Pad) (PortC bit5)
3-2 19 (BP right) - (Same as D-Pad) (PortB bit1)
3-1 18 (BP left) - (Same as D-Pad) (PortB bit0)
Byte 4 Not Implemented yet
4-7 16 (CHRG down) (rotary encoder flag bit)
4-6 14 (DIF IN up) (rotary encoder flag bit)
4-5 15 (DIF IN down) (rotary encoder flag bit)
4-4 17 (CHRG up) (rotary encoder flag bit)
4-3 static 1 ???
4-2 static 1 ???
4-1 static 1 ???
4-0 static 1 ???
Byte 5 Not Implemented yet
It shows DIF IN rotary enc steps.
Rotate up: xxxx 1111
Rotate down: xxxx 0000
xxxx shows how much step was from last read out, but I can't count exactly.
Byte 6 Not Implemented yet
It shows CHRG rotary enc steps.
Rotate up xxxx 1111
Rotate down xxxx 0000
Byte 7 static
Byte 8 static
Ah, each push button has 2 pins - you connect one to Arduino, another to the Ground :)
Pressed button gives you "0" (grounded signal), released = "1" (pulled-up to +VCC)
For D-pad use an Analog mini joy 10kOhm
Feel free to modify and use it for your needs.
This sketch and the documentation above provided "AS IS" under the BSD New license.
http://opensource.org/licenses/BSD-3-Clause
Based on (c) Taras Ivaniukovich (blog@rr-m.org) April 2015
Istvan Virag Aug 2016 added some F1 wheel function
http://rr-m.org/blog/hacking-a-thrustmaster-tx-rw-wheelbase-with-arduino-uno-part-2/
*/
//#include "pins_arduino.h" // not necessary in 1.6.3?
#include <SPI.h>
#define D_padX A6
#define D_padY A7
#define treshold_min 75 // treshold limits of buttons 0-255 (1 Byte)
#define treshold_mincent 100 // You can setup as you like it
#define treshold_maxcent 156 //
#define treshold_max 181 //
byte wait;
volatile byte wheelState[16];
volatile byte pos = 1;
volatile boolean SSlast = HIGH; // SS last flag.
volatile boolean ReadFlag = HIGH;
volatile byte AnalogValue;
volatile byte D_Pad_State = B11111111;
volatile byte analogD_padX = 128;
volatile byte analogD_padY = 128;
void setup () {
sei(); //enable global interrupts
DDRB |= B00001011; // digital pins 8,9,11 used as inputs with a pull-up to +VCC
PORTB |= B00001011;
DDRC |= B00111111; // pins 14-19 (A0 - A5) also used as digital inputs
PORTC |= B00111111; // pulled-up to +VCC via internal 100k resistors
DDRD |= B11111111; // digital pins 0,1,3,4,5,6,7 used as inputs
PORTD |= B11111111; // pulled-up to +VCC via internal 100k resistors
wheelState[0] = B11001111; // TX RW Ferrari 458 Italia Wheel first data byte
wheelState[1] = B11111111; // second data byte - buttons
wheelState[2] = B11111111; // third data byte - buttons
wheelState[3] = B11111111; // this and below - not used, but wheelbase reads all 8 bytes...
wheelState[4] = B00000000;
wheelState[5] = B00000000;
wheelState[6] = B01100000;
wheelState[7] = B01000000;
wheelState[8] = 0x00; // Just for more compability to the future
wheelState[9] = 0x00;
wheelState[10] = 0x00;
wheelState[11] = 0x00;
wheelState[12] = 0x00;
wheelState[13] = 0x00;
wheelState[14] = 0x00;
wheelState[15] = 0x00;
// SPI parameters
SPCR = B11000000; //SPI Slave setup
pinMode(MISO, OUTPUT); // Slave device
/* Pin Change Interrupt services
* PCICR |= PCIE0 1
* PCMSK = PCINT7-0 PCINT6-0 PCINT5-0 PCINT4-0 PCINT3-0 PCINT2-1 PCINT1-0 PCINT0-0
*/
PCICR = B00000001; //Configure PCINT2
PCMSK0 = B00000100; // Interrupt on SS pin
}
// PinChange Interrupt for start SPI communication
ISR (PCINT0_vect) {
if (!(PINB & B00000100)) {
SPDR = wheelState[0]; // load first byte into SPI data register
pos = 1;
}
}
// SPI interrupt routine
ISR (SPI_STC_vect) {
SPDR = wheelState[pos++]; // load the next byte to SPI output register and return.
}
// Interrupt service routine for the Analog reading
ISR (ADC_vect) {
switch (ADMUX & B00000001) {
case 0x00: analogD_padX = ADCH; // 8 bit AD conversion is enough
break;
case 0x01: analogD_padY = ADCH;
break;
}
ADCSRA = B00000100; // Stop ADC
ReadFlag = HIGH;
}
void loop() {
// scan the button presses
if (ReadFlag) { // Start Next Analog Read
switch (ADMUX & B00000001) {
case 0x00:
ADMUX = B01100111;
ReadFlag = LOW;
ADCSRA = B11001100; // ADC setup, start
break;
case 0x01:
ADMUX = B01100110;
ReadFlag = LOW;
ADCSRA = B11001100; // ADC setup, start
break;
}
// analog joy 1 X coordinate
if (analogD_padX < treshold_min) { //0XX1PPPP go down
D_Pad_State &= B01110000;
D_Pad_State |= B00010000;
}
else if ( analogD_padX > treshold_max) { //1XX0PPPP go up
D_Pad_State &= B11101111;
D_Pad_State |= B10000000;
}
else if ( (analogD_padX > treshold_mincent) & (analogD_padX < treshold_maxcent)) { //1XX1PPPP stay
D_Pad_State |= B10010000;
}
// analog joy 1 Y coordinate
if (analogD_padY < treshold_min) { //X10XPPPP go left
D_Pad_State &= B11011111;
D_Pad_State |= B01000000;
}
else if ( analogD_padY > treshold_max) { //X01XPPPP go right
D_Pad_State &= B10111111;
D_Pad_State |= B00100000;
}
else if ( (analogD_padY > treshold_mincent) & (analogD_padY < treshold_maxcent)) { //X11XPPPP stay
D_Pad_State |= B01100000;
}
}
wheelState[0] = (B01000000 | ((PINB << 4) & B10000000) | (PINC & B00001111));
wheelState[1] = PIND; // take 8 bits from PORTD
wheelState[2] = (((D_Pad_State >> 1) & B01111000) | (PINB & B00000011) | ((PINC << 2) & B10000000) | ((PINC >> 2) & B00000100)) ;
// wheelState [8] = analogD_padX; // You can setup treshold limits with a Raspberry Pi
// wheelState [9] = analogD_padY;
// wheelState [10] = D_Pad_State;
} // end of main loop()