Hi,
I bought an Idrive F10/30 7 button model to make it work against the OAP pro 12. I know, not supported, do it yourself, don't ask for support, blah blah.
Anyway, if someone is interested in make it work and have the knowledge to use them within a script or whatever trick to make it work with OAP, here is the info and how to connect and initialize the device.
The Idrive in question is a BMW 6582 9286699-03 HW:01.01.00 SW02.03.01 Date:02.08.16
It is the 7 buttons version, not touch version, of F10/30, the one on the attached photo.
Now the how to make it work.
You need to have a canbus adapter working on the pi, like the mpc2515.
In the boot/config.txt you need to add:
/boot/config.txt please add in order to activate the SPI and setup the "port":
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25
NOTE: in my case the adaptor came with an 8Mhz (8000000) crystal but you need to modify the value to the one you use.
Then you need to connect the idrive as follow:
12V -PIN1
GND -PIN2
CAN_H -PIN3
CAN_L -PIN4
Note: the PIN numbers are visible printed in the case.
Then reboot your PI.
After that you need to setup the interface for the desire idrive controller and speed. As is the new model it works in 500k(500000), the 1st gen works in 100k, so the command should be:
ip link set can0 up type can bitrate 500000
After that you are ready to connect to the can bus. You can check if all works as expected executing ifconfig.
You should see your interfaces and one new interface called can0.
If you don't have the can-utils already installed, it's a good time to do it.
sudo apt-get install can-utils
After that you can execute:
candump can0
You should see your idrive publishing every few seconds in a loop :
can0 1AA [8] 8F 17 F2 00 00 00 00 00
That is your idrive alive.
Then you need to initialise the idrive. For that you need to publish:
cansend can0 563#63 - that command alone makes the idrive to respond:
can0 5E7 [8] 99 01 0A 00 06 00 00 01
can0 267 [6] E1 EA 00 00 C0 00
can0 5E7 [8] 99 01 0A 01 06 00 00 00
can0 567 [8] 00 00 00 00 00 00 00 67
can0 5E7 [8] 99 01 0A 02 06 00 00 00
can0 567 [8] 00 00 00 00 00 00 00 67
can0 567 [8] 00 00 00 00 00 00 00 67
can0 5E7 [8] 99 01 0A 03 06 00 00 00
idrive will publish that 5E7#99 01 0A 01 06 00 00 00 ---3 times and then it goes to sleep again as we do not complete the initialisation.
To complete the initialisation you need to respond to those 5E7 with the following command:
cansend can0 273#1de100f0ff7fde01
If you don't sent that command you will see that all the buttons works, and the idrive publish the state, but the rotary knob don't work. So in order to make the rotary knob to work the sequence to initialise the idrive should be:
cansend can0 563#63
cansend can0 273#1de100f0ff7fde00
Take into account that the idrive afterward need to be asked to be awake with the command
cansend can0 563#63 every 2 seconds. If you don't maintain it awake and it goes to sleep the you need to send again both commands as before or the rotary knob will not work.
Just for the test, I'm not saying is a good practice, if you sent both commands every 2 seconds in a loop it will work always and the idrive publish the buttons and rotary knob state without any issue.
You can do that by executing:
watch -n 2 "cansend can0 563#63 & cansend can0 273#1de100f0ff7fde00"
That command will publish every 2 second both commands, and no matter what you do with the idrive you will see the reply in the candump log.
Now the codes related to the buttons:
Note: the las byte is the ID of the button. The "XX" is a value that increments in a loop every time you press the button.
In order to control the dimmer led on the idrive yo can send:
cansend can0 202#XX
XX can be from "00" to "FD", "FE" to turn the led off.
###In my case I have the following buttons:
#MEDIA - last byte ID 10
>Press ---- 267 [6] E1 FD XX 01 C0 10
>Release ---- 267 [6] E1 FD XX 00 C0 10
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 10
#RADIO - last byte ID 08
>Press ---- 267 [6] E1 FD XX 01 C0 08
>Release ---- 267 [6] E1 FD XX 00 C0 08
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 08
#TEL - last byte ID 40
>Press ---- 267 [6] E1 FD XX 01 C0 40
>Release ---- 267 [6] E1 FD XX 00 C0 40
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 40
#NAV - last byte ID 20
>Press ---- 267 [6] E1 FD XX 01 C0 20
>Release ---- 267 [6] E1 FD XX 00 C0 20
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 20
#MENU - last byte ID 01
>Press ---- 267 [6] E1 FD XX 01 C0 01
>Release ---- 267 [6] E1 FD XX 00 C0 01
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 01
#BACK - last byte ID 02
>Press ---- 267 [6] E1 FD XX 01 C0 02
>Release ---- 267 [6] E1 FD XX 00 C0 02
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 02
#OPTION - last byte ID 04
>Press ---- 267 [6] E1 FD XX 01 C0 04
>Release ---- 267 [6] E1 FD XX 00 C0 04
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 04
#Rotary Joystick push button:
>Press ---- 267 [6] E1 FD XX 01 DE 01
>Release ---- 267 [6] E1 FD XX 00 DE 01
>Hold >2sec ---- 267 [6] E1 FD XX 02 DE 01
#Rotary Joystick > Up, down, right, left:
Press:
>Up ---- 267 [6] E1 FD XX 1Y DD 01
>Down ---- 267 [6] E1 FD XX 4Y DD 01
>Right ---- 267 [6] E1 FD XX 2Y DD 01
>Left ---- 267 [6] E1 FD XX 8Y DD 01
As the rest of the buttons "Y" can be 1 for press, 2 for hold, 0 for release.
>Release ---- 267 [6] E1 FD XX 00 DD 01
#Rotary Knob clockwise/cclockwise:
264 [6] E1 FD XX YY 80 1E
XX incremental value in a loop on every click.
YY value increments or decrements +/-1 on every click on the knob.
All the info is related to the 7 buttons idrive, but as I read in other forums the 5 buttons version works the same way even with the same IDs. If your Idrive have different named buttons the ID change to the following:
IDs related to the last byte:
08 AUDIO/RADIO
10 MEDIA
20 NAV
01 MENU
40 TEL
04 OPTIONS
02 BACK
It would be great if Bluewave take this info into account, as it is clearly documented and is quite easy to modify/copy the actual code profile of the already integrated Gen1 idrive on AOP pro to add support for the idrive f10/30.
As I don't have the knowledge to code it by scripting or python or other language it will be great if someone can help on that.
Best regards.
I bought an Idrive F10/30 7 button model to make it work against the OAP pro 12. I know, not supported, do it yourself, don't ask for support, blah blah.
Anyway, if someone is interested in make it work and have the knowledge to use them within a script or whatever trick to make it work with OAP, here is the info and how to connect and initialize the device.
The Idrive in question is a BMW 6582 9286699-03 HW:01.01.00 SW02.03.01 Date:02.08.16
It is the 7 buttons version, not touch version, of F10/30, the one on the attached photo.
Now the how to make it work.
You need to have a canbus adapter working on the pi, like the mpc2515.
In the boot/config.txt you need to add:
/boot/config.txt please add in order to activate the SPI and setup the "port":
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25
NOTE: in my case the adaptor came with an 8Mhz (8000000) crystal but you need to modify the value to the one you use.
Then you need to connect the idrive as follow:
12V -PIN1
GND -PIN2
CAN_H -PIN3
CAN_L -PIN4
Note: the PIN numbers are visible printed in the case.
Then reboot your PI.
After that you need to setup the interface for the desire idrive controller and speed. As is the new model it works in 500k(500000), the 1st gen works in 100k, so the command should be:
ip link set can0 up type can bitrate 500000
After that you are ready to connect to the can bus. You can check if all works as expected executing ifconfig.
You should see your interfaces and one new interface called can0.
If you don't have the can-utils already installed, it's a good time to do it.
sudo apt-get install can-utils
After that you can execute:
candump can0
You should see your idrive publishing every few seconds in a loop :
can0 1AA [8] 8F 17 F2 00 00 00 00 00
That is your idrive alive.
Then you need to initialise the idrive. For that you need to publish:
cansend can0 563#63 - that command alone makes the idrive to respond:
can0 5E7 [8] 99 01 0A 00 06 00 00 01
can0 267 [6] E1 EA 00 00 C0 00
can0 5E7 [8] 99 01 0A 01 06 00 00 00
can0 567 [8] 00 00 00 00 00 00 00 67
can0 5E7 [8] 99 01 0A 02 06 00 00 00
can0 567 [8] 00 00 00 00 00 00 00 67
can0 567 [8] 00 00 00 00 00 00 00 67
can0 5E7 [8] 99 01 0A 03 06 00 00 00
idrive will publish that 5E7#99 01 0A 01 06 00 00 00 ---3 times and then it goes to sleep again as we do not complete the initialisation.
To complete the initialisation you need to respond to those 5E7 with the following command:
cansend can0 273#1de100f0ff7fde01
If you don't sent that command you will see that all the buttons works, and the idrive publish the state, but the rotary knob don't work. So in order to make the rotary knob to work the sequence to initialise the idrive should be:
cansend can0 563#63
cansend can0 273#1de100f0ff7fde00
Take into account that the idrive afterward need to be asked to be awake with the command
cansend can0 563#63 every 2 seconds. If you don't maintain it awake and it goes to sleep the you need to send again both commands as before or the rotary knob will not work.
Just for the test, I'm not saying is a good practice, if you sent both commands every 2 seconds in a loop it will work always and the idrive publish the buttons and rotary knob state without any issue.
You can do that by executing:
watch -n 2 "cansend can0 563#63 & cansend can0 273#1de100f0ff7fde00"
That command will publish every 2 second both commands, and no matter what you do with the idrive you will see the reply in the candump log.
Now the codes related to the buttons:
Note: the las byte is the ID of the button. The "XX" is a value that increments in a loop every time you press the button.
In order to control the dimmer led on the idrive yo can send:
cansend can0 202#XX
XX can be from "00" to "FD", "FE" to turn the led off.
###In my case I have the following buttons:
#MEDIA - last byte ID 10
>Press ---- 267 [6] E1 FD XX 01 C0 10
>Release ---- 267 [6] E1 FD XX 00 C0 10
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 10
#RADIO - last byte ID 08
>Press ---- 267 [6] E1 FD XX 01 C0 08
>Release ---- 267 [6] E1 FD XX 00 C0 08
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 08
#TEL - last byte ID 40
>Press ---- 267 [6] E1 FD XX 01 C0 40
>Release ---- 267 [6] E1 FD XX 00 C0 40
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 40
#NAV - last byte ID 20
>Press ---- 267 [6] E1 FD XX 01 C0 20
>Release ---- 267 [6] E1 FD XX 00 C0 20
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 20
#MENU - last byte ID 01
>Press ---- 267 [6] E1 FD XX 01 C0 01
>Release ---- 267 [6] E1 FD XX 00 C0 01
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 01
#BACK - last byte ID 02
>Press ---- 267 [6] E1 FD XX 01 C0 02
>Release ---- 267 [6] E1 FD XX 00 C0 02
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 02
#OPTION - last byte ID 04
>Press ---- 267 [6] E1 FD XX 01 C0 04
>Release ---- 267 [6] E1 FD XX 00 C0 04
>Hold >2sec ---- 267 [6] E1 FD XX 02 C0 04
#Rotary Joystick push button:
>Press ---- 267 [6] E1 FD XX 01 DE 01
>Release ---- 267 [6] E1 FD XX 00 DE 01
>Hold >2sec ---- 267 [6] E1 FD XX 02 DE 01
#Rotary Joystick > Up, down, right, left:
Press:
>Up ---- 267 [6] E1 FD XX 1Y DD 01
>Down ---- 267 [6] E1 FD XX 4Y DD 01
>Right ---- 267 [6] E1 FD XX 2Y DD 01
>Left ---- 267 [6] E1 FD XX 8Y DD 01
As the rest of the buttons "Y" can be 1 for press, 2 for hold, 0 for release.
>Release ---- 267 [6] E1 FD XX 00 DD 01
#Rotary Knob clockwise/cclockwise:
264 [6] E1 FD XX YY 80 1E
XX incremental value in a loop on every click.
YY value increments or decrements +/-1 on every click on the knob.
All the info is related to the 7 buttons idrive, but as I read in other forums the 5 buttons version works the same way even with the same IDs. If your Idrive have different named buttons the ID change to the following:
IDs related to the last byte:
08 AUDIO/RADIO
10 MEDIA
20 NAV
01 MENU
40 TEL
04 OPTIONS
02 BACK
It would be great if Bluewave take this info into account, as it is clearly documented and is quite easy to modify/copy the actual code profile of the already integrated Gen1 idrive on AOP pro to add support for the idrive f10/30.
As I don't have the knowledge to code it by scripting or python or other language it will be great if someone can help on that.
Best regards.