-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Document SER-DATA-IN protocol #2
Comments
I am have a slightly different accoustimass system (lifestyle 12) and my control center is half dead. My subwoofer has a slightly different connector (its a regular DIN instead of mini-DIN) and does not accept SPDIF but I would expect the serial protocol to be the same. So far, the protocol is not evident.. but seems simple enought to be "clonable" from a working system. The serial line is always pulled up. I am seeing what seems to be the encoded commands using a similar method to the NEC codes from the remote (as in short and long pulses) but the pulses seem to be 1msec or 2msec in duration. There is a 8 msec "start" bit of sorts and also a 2-msec "stop" bit. The comands seem to be 13 bit in length which is quite weird. Might be 12-bit + parity but I havent't checked yet. I think its totally possible to control the accoustimass system without the console. I'll have to keep trying. |
Excellent. Let me know if I can help by looking at something, although I do not have access to the system right now (might take a couple of weeks). |
Im still trying to figure out the encoding to be honest. But I think we can
just dump the commands in a format similar to the "raw" format similar to
irdb. Should be easy enough to reproduce. Basically the line has a 5V
pull-up and there a transistor should pull it down. I have a model 5-V
music center and an accoustimass 12 subwoofer/amp.
I will see if I can hack something up.
…On Thu, Jul 11, 2019 at 2:59 AM probonopd ***@***.***> wrote:
Excellent. Let me know if I can help by looking at something, although I
do not have access to the system right now (might take a couple of weeks).
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#2?email_source=notifications&email_token=ACQV3WF6Q5KZTSP3F4XMVNLP63D2NA5CNFSM4ETMAE22YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODZVTA7A#issuecomment-510341244>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/ACQV3WEP45LQQEGRK32Q2BDP63D2NANCNFSM4ETMAE2Q>
.
|
Here are some images of the traces I captured last night. The narrow pulses are 1msec in width and the wide ones are 2msec. The long pulse down at the start (some sort of "start bit") is 8msec. From what I am seeing, it seems that the encoding is something similar to the IR encoding with short-short or long-short pulses. And then the "stop" bit seems to be the only "long" low bit (as well as the start). |
Interesting! Hope you can figure something out by comparing some codes. Maybe @bengtmartensson recognizes this type of code from just looking at it? |
Looks like biphase encoding to me. IrpTransmogrifier is a good tool for analyzing this. |
I though it was bi-phase but if you look carefully, there are no "long" zeros (other than the start and stop bits). So far, it seems to be more a case of "pulse width modulation" where the low portion is always 1msec (except for start/stop bits) and the high part is either 1msec or 2 msec. I arbitrarily chose "1" to be 2msec pulses and 0 for 1 msec pulses. Using this mechanism, I was able to decode all the codes from the remote. Code length is still weird (as in 13 bits or 20 bits in total).. but I guess BOSE was not expecting to be compatible or interoperable with anyone else. I have attached captures in "IRDB RAW" format (as in indicating the length in micro-seconds for each pulse, whether low or high for all the keys. I have not attempted to make any sense out of each yet, but im pretty confident that just reproducing the same codes will trigger the accoustimass amp to switch inputs, change volume. mute, etc.. We should also note that there are 50 msecs between two codes (plenty of keys send two codes). The circuit is super simple. A pull-up drives it yo 5V and we pull down the line with an arduino directly or through a transisitor. bose remote codes.xlsx If we just want to control the sub, we can just trigger those codes and I guess the accoustimass will react in the same way as if the control center would be connected. |
For example, using the encoding I described above, and SSSS being the 8-msec long Start bit and TTTT the 2msec stop bit, these are the keys for volume and surround vol:
And for the function switch (surround mode)
Finally, some of the Function keys:
All the keys are logged in the excel and CSV file It seems as if the second key press of the function key is the same for all functions. Which could be an attempt to turn on the subwoofer just in case. |
Wow, awesome work @garci66. I am trying to convert those codes into something IrScrutinizer understands, so that it can easily be converted from there into various formats. Looking at VIDEO as an example, I wonder whether
can be written as
or even be cleaned up a bit to read
Which would translate, according to IrScrutinizer, to Pronto Hex
Does this look right? |
I am a bit confused as to why something else than the would get sent to the Acoustimass module regarding the input source such as VIDEO, AM, FM, CD, TAPE or actions like REWIND. Isn't that something that is entirely handled in the Music Center? Or are you talking about controlling the Music Center, not the Acoustimass module? Both are interesting, but my end goal is to be able to se the Acoustimass module without the Control Center. |
Just to show you what you can do with IrpTransmogrifier: First a slightly edited version of bose remote codes.txt above: Transmogrifying:
|
This is truly amazing @bengtmartensson |
I don't think you need your first "+8000" part on the signals.. basically the line is always idle at +5v (it's pulled up by both the accoustimass and the console it seems. (or on the accoustimass side when it's powered up). Other than that, the graph you show seems perfect. If we are using an aruduino and its internall pullups then we need to leave the line "idle" at "1" or "high-z". And then we start by writing a 0 for 8msec (the start bit), then we write a the whole pattern and finally we write a 0 for 2msec (the stop bit). If we're using an external transistor and external pullup we might need to invert the output first but not sure. The system seems to have a 10K pull-up according to the service manual. Also, regarding why other keys (than volume, mute, surround) get passed along.. the service manual says the following:
I guess this means that you could have a BOSE (or bose compatible) tape deck and receive commands via the serial Bus (and why the control center has two serial ports in parallel so that you can connect other devices). Finally, just wanted to mention that I used the remote and the music center configured with the "house code" of 0000 and also the speaker config for 00 (I believe its speakers A). didn't test what happens when using other settings. I will try a very simple arduino sketch to send basic commands to the sub and see if it "reacts accordingly". Not sure how many "orphan" accoustimass amps are lying around without a console, but it would be good that we're able to "revive" them... ;-) |
But just to clarify, all those commands were captured between the Accoustimass sub and the music center and my objective is the same as yours, being able to control an accoustimass amp without the music center. (in fact, all of this data came while I was fixing a music center for a friend but I started looking at getting rid of it just in case the music center was mostly dead). My idea was to replace the music center for a raspberry pi and basically make it act as a spotify receiver and trigger the volume commands / surround / etc from the raspberry as well. |
And one more thing.. it seems I need to capture the "OFF" key again!.. damn... if you look at the timestamp, I copy-pasted the same dump as mute and not the OFF pattern... and I think OFF is quite useful! And it seems that the code identified by IRtransmogrifier as "313" would be something like "power on" or something of sorts.. as it seems to be sent as the second command for every command. Maybe it wasn't identifying the sub as powered on? |
The Arduino sketch also would need to take care of switching on the amp, I guess. Maybe @bengtmartensson can show us how to use https://github.com/bengtmartensson/AGirs to send the required signals using an Arudino? |
From everything I saw the amp switches on with any of the source commands
or the command shown as 131 on the decode. I still need to test it.
I need to capture the off command as well.
Of using a 5v Arduino then we can drive the pin directly.
…On Sat, Jul 13, 2019, 19:43 probonopd ***@***.***> wrote:
The Arduino sketch also would need to take care of switching on the amp, I
guess.
Maybe @bengtmartensson <https://github.com/bengtmartensson> can show us
how to use https://github.com/bengtmartensson/AGirs to send the required
signals using an Arudino?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#2?email_source=notifications&email_token=ACQV3WHHLJGV5LZJ6UOY6OLP7JK7RA5CNFSM4ETMAE22YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODZ32U2I#issuecomment-511158889>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/ACQV3WDTYDSTCFI3EQXUT7TP7JK7RANCNFSM4ETMAE2Q>
.
|
AGirs is more thought of as an interactive server, reads from a Stream (typically Serial or Tcp); sure, it can be done, but seems a bit unnatural. However, using Infrared4Auduino (which sits "under" AGirs) can be a good idea. So I used an experimental version of IrpTransmogrifier (see this), command line
which produced the result: Automatic generation of code for arbitrary IRP protocols is unfortunately not implemented yet. But we can use the raw code generator of IrScrutinizer to generate code for Infrared4Arduino/IRremote/IrLib: |
Thank you @bengtmartensson, that should get us started. |
The following is the capture for power off (which was missing from the capture) 17:42:27.368 -> --START|SSSS|, +2000, -1008, +996, -1008, +996, -1012, +1996, -1012, +1996, -1012, +1996, -1012, +1996, -1012, +1996, -1012, +1996, -1012, +996, -1008, +2000, -1008, +2000, -1012, +992|TTTT|END 17:37:59.987 -> , +75908472SSSS|1001111110110|TTTT|END |
Thank you. Have you been successful in sending those commands from Arduino? |
did a try last night but did not succeed. (I only have the subwoofer so its hard to test the audio). The sub has no leds or anyhting so its really hard to know if it received any command. |
Hey there, I have a working Lifestyle 12 system (acoustimass & music center) using the 9-Pin DIN connector -> 2xRCA + 3,5mm jack (9v power on voltage, 5v data, gnd). Currently, the music center is used only to turn the acoustimass on and off. Also have a spare 5v arduino and some experience with reverse engineering / bit banging proprietary wireless protocols. But I'm not into electronics, voltages & milliamperes. Could you tell me how to wire the arduino in between the two devices without risking to blow out any of the chips? Especially with regard to the 9v power on voltage I think it wouldn't be wise simply connecting it to a 9v psu - but how much current should one use? Thanks in advance! 👍 |
Hi, I got a PS48 III speaker recently (I think it's otherwise known as Lifestyle 28 Series III) with incomplete set of satellite speakers, but without controller / music center. When searching online, I got across an old post with information seemingly describing a way to control "Lifestyle 28II, 38 or 48" via generic serial port - https://us.v-cdn.net/6031006/uploads/vbulletin_attachments/7/2/0/539.doc (found on https://proforums.harman.com/amx/discussion/193/rs232-control-of-bose-lifestyle). I haven't tried anything further yet, prefer to check my chances first. Thank you 😊 |
Hi, I can confirm that an Lifestyle® 8 Series II system can be controlled via 4800 baud TTL signals . You can easily us an Arduino to send commands or even a RS-232 port from a PC as long as you have some thing to convert the signals to TTL . I have also used the program located at this site https://terencewrose.webador.co.uk/ to control the unit with no issues. I am halfway through writing code to convert a standard TV remote to control the units with the help of an Arduino Uno. It is very straight forward as standard libraries already exist to decode IR signals and to create software based comm ports. |
Here are some control codes initialize system +1db Mid volume
2spk mode 3spk mode 5spk mode Digital select Analog select Mute on Mute off |
Wow @741Z I am very much looking forward to that. |
The 89 pages Bose manual Part Number 199401-TG1 ("Troubleshooting Guide Powered Acoustimass® -25 and -30 Series II Speaker System AM-25P II/ AM-30P II Digital Bass Module") has the information we've been after.
The recommended test setup involves a special Bose cable and a third-party serial converter box and is described on p. 68:
The TTL to RS232 Converter for the PC is described on p. 80:
The codes are described on pp. 80: Bose did (does?) have excellent manuals. It's a shame they didn't come in the box. I'd have loved to have this information back in the day when the device was new. I mean, it really explains stuff... |
Thank you so much! I still posess the unit and look forward to start tinkering with it again 👍 |
Here in a format suitable for pasting into source code:
|
...and with that, I wonder whether this Arduino "mute/unmute sketch" would toggle mute on and off:
Unfortunately I don't have the device at hand currently. Maybe @741Z can confirm? |
Quickly put together an Arduino library that makes this easier to use: Would love code reviews and tests. Unfortunately I don't have the device at hand currently. |
I am not sure where you are sending your serial signal. I use the library SoftwareSerial on the Arduino to send the data to some defined I/O pins. You should think about sending an initialisation string that puts the unit in the correct state for your use case. For example if the are in DTS mode and send an analogue signal you won't hear anything out of the unit. |
The simplest way to start talking to the unit is to buy a $2 USB to TTL Serial Cable from Aliexpress and install something like Terra term or some other terminal that will talk to a comm port. |
Updated the library to use SoftwareSerial. |
Below is a simple code for use on an Arduno uno, it is slightly tweaked code from one of the examples provided on with SoftwareSerial library. When you run the serial monitor in the Arduino IDE ( set in this code at 19200 Baud) you will be able to talk to the Bose speaker via pins 1 and 2 of the Arduino . The response back from the speaker will show in the serial monitor. Using this code will confirm that you are correctly talking to the speaker. I will share the code that converts from using and IR remote to control the speaker shortly. #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); // RX, TX void setup() } Serial.println("let's go!"); // set the data rate for the SoftwareSerial port void loop() // run over and over } |
I am facing the same issue, the Sub is the only working component left. @probonopd I've tried your Code, both from this Thread and the Library one with. I couldn't get any good result, nothing seems to work an the Bose. /var/folders/kg/6601vtgs30db0vsrd205gj100000gn/T/arduino_modified_sketch_56594/MuteUnmuteExample.ino: In function 'void loop()': I tried to tweet both codes and implemented the starting procedure. Nothing did anything bool isMuted = false; void setup() { Serial.begin(4800, SERIAL_8N1); // Start serial communication void loop() { delay(10000); // Sleep for 10 seconds // Unmute the audio and turn off the LED delay(5000); // Sleep for 5 seconds } |
I have not looked at your code too closely, however, something does not seem right here. During the initial debug process you probably want 2 serial ports, one serial port accessible via the USB port so you ( most code samples refer to this port as "serial", and then you need to define the software serial port, often called "myserial" is some of the sample code on the internet. Don't forget to also define the I/O pins of the TX and RX pins . Reference info here https://docs.arduino.cc/learn/built-in-libraries/software-serial. I have been writing some code that converts a generic IR remote signals to control the Bose amplifier. Once I have done a bit more polishing of the code I will share it here. |
Thanks for the reply. If I understand correctly, the Serial. always refers to the TX and RX ports of the board. If you have a code that can get the Bose Subwoofer to work I be grateful, so I could find out if maybe that ist the problem or not. Mine is a Acoustimass 8 with the 8 PIN connector. On the cable the 3.5mm jack and white and red Chinch for input. |
**My comments below refer to an Arduino Uno. Things may be different if you are using something different , Example ESP32 ** "Serial" is generally the hardware serial port accessible via usb. For debug and monitoring comms coming back from the bose unit, I would be continuing to keep this port on. With "software Serial" you define a second port to talk to the bose amp, an example could be pin 10 and 11 of an Arduino uno. The output of the Arduino Uno is TTL ( aka 5v= 1 and 0 volt = 0 ) which which works perfectly with the bose ( never plug an RS-232 cable directly into the bose amp as this is much higher voltage and may damage the bose). The bose will work with only: gnd, RX pin, and the "power on" pin. However, if you also connect the bose TX pin you can read back things like temperature and bass and treble settings. |
Thanks, I fidelt around but nothing really worked. And how would you connect the TX? Wouldn't that connect RX and TX together cause there is only one data Port? Sorry for all the questions I already feel silly, but as having trouble getting anykind of progress as it seems, my thought feel a little blocked |
This image shows the pins for TX and RX on the Bose plug. https://cloud.githubusercontent.com/assets/2480569/21572405/dbf18478-ced8-11e6-9ec8-199eccb8d46c.jpg You can buy the plugs from Ali Express for about $1-$2 each. In the short term if you have single wire Dupont pin connectors handy, you can make contact with the relevant pins. Don't forget Comms ground and Audio Ground ( Common) are different, and nothing will work unless the Bose power on pin is seeing 9-10 volts. A simpler way to kick things off is buy a usb to TTL out cable from Ali Express ( $1-$3 ) and use a terminal emulator on your PC ( Tera Term is an option). You can then talk directly to the Bose amp. This will confirm all your basic electrical connections are working correctly. The Bose service manuals have example of how to connect a PC via a comm port to the Bose unit. |
As promised here is the code that works. Feel free to contact me if you have questions. Use at your own risk. no warranties provided . XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX #include <IRremote.hpp> //used to read IR remote signals /* Communication : You will need to connect from the relevant pins of the Arduino to the connector pins on the BOSE. Connecting to the TX pin of the Bose unit ( RX pin on the Arduino) is not strictly necessary, but can give some handy information on the units operation. For example temperature readings. Display LEDs: Pins 6 and 7 are connected to LED’s they will give some simple indication of status and operation. Power and volume buttons : Pins 3 thru 5 are used to provide simple on/off, volume up/down functionally. IR remote control : A standard IR receiver module ( less that $1 on Ali express) is used to receive IR signals via pin 2. Most IR remotes can be used, just create some simple code to decode the signals of the remote control you have and them map the code to the command you want to perform in the code. Powering up the Bose Amplifier: Not the unit needs a specific voltage at one of the pins to turn on the units triac via an opto couple. You will need to construct a specific circuit to provide this power to the unit. This code sends power to pin 8 to power up the power circuit. However, the Bose manuals show a temporary way to use a 9 volt battery to do the same job for testing purposes. NOTE 1: If you only connect the 3 digital push buttons, connect the TX/RX pins and provide the correct voltage to the power up pin that should be sufficient to prove out your code and connections. NOTE 2 don't forget to include libraries IRremote.hpp & SoftwareSerial.h> Text V1.0 // Set TX and RX pins for Bose comms //int IRsignal Set IRinput to pin 2 // set up IO // Variable setup int buttonState = 0; // variable for reading the Power pushbutton status void setup() { // initialize the pushbutton pin as an input: IR.enableIRIn(); delay (1000); // wait for initialization } // End setup loop void loop() { //blink both green and red leds until unit has been sent "power on" command up after MCU being powered up // read the state of the pushbutton value: // Check if power button pushed // Volume Down button Note : Holding button will mean function will continue to repeat // Volume Up button Note : Holding button will mean function will continue to repeat if (IR.decode()) { Serial.println(IR.decodedIRData.decodedRawData,HEX) ; // Send recieved IR code to Terminal session via USB // Action recieved IR code switch (IR.decodedIRData.decodedRawData ) { default: } // End case statement delay (500); } //Functions int PowerToggle(){
} //end PowerToggle function int MuteToggle(){
} // End mutetoggle function int VolUp() int VolDown() int LedBlink() //Function to Blink LED to indicate signal int ListentoSerial() // loop to display comms from amplifier while (mySerial.available()>0) |
@741Z Great work. Thanks for the info. |
I think I have solved my question. The tn 0,0,0,0,0,0,0,0,0 code is for DSP off. |
Let's document the SER-DATA-IN protocol of the Acoustimass module so that we can use the Acoustimass module without the original Music Center.
Update 2023: See below for documentation provided by Bose.
The text was updated successfully, but these errors were encountered: