Roland Juno G display replacement

My friend had a Roland Juno G keyboard that after some time get the LCD display broken.

That issue is a common problem. Roland produced some display revision and the new release should fix the issue, but the replacement was very expansive and now is out of production.

The keyboard still works and can be programmed using the pc software but we want to try to get a replacement for cheap.

The original display is a 240×90 display with backlight. Since the issue is that only half of the display is working is clear that the display is equipped with two controller that drives the two half of the display.

The confirmation from this come from the service manual, the display have two CS lines.

The bad thing is that we don’t know anything about the embedded controller and the protocol used by the display. We know just that between then v1 revision and the v2 revision of the display a bootloader and firmware upgrade is required. From information found on some forum it appears that after the LCD replacement the new display doesn’t works correctly and during the upgrade procedure comething is visible on replaced LCD. So the basic protocol is the same between firmware <2.0 and 2.0.1 but we won’t consider the 2.0.1 firmware release.

The idea is to use a microcontroller to intercept the data from the display, convert the protocol and display the data on a completely different display.

I’ve looked all over Amazon and AliExpress to look for a replacement. It doesn’t exists any LCD with similar characteristics and size so I’ve bought a 5.0″ TFT display with an ILI9488 controller and a SPI interface for about 15/17€.

For this kind of operation an Arduino Mega should be the best choice for the number of gpio.

Then I bought an ESP32 Dev board that is much more cheap and should have enough power, gpio for this project. A plus is the WiFi that should make much easier to update the firmware with ArduinOTA.

Since I don’t have the keyboard here yet, I’ve started playing with the firmware, the esp32 and the display.

The firmware is composed of multiple blocks of data with different file and at the end there is the firmware blob. It appears to be compressed with an lz algo.

Hopefully that compression method was used on other Roland products and someone wrote a program to uncompress that format.. I had just to split the file at the right offset to get an uncompressed binary.

I renamed the file like junog.raw.data and I’ve opened it with gimp. I’ve chooses a 1bit format and moved between the offset and the width and height and after some attempt I was able to locate the offset of the boot splash of the keyboard with the expected size (240 x 96 px).

I’ve converted to a c byte array and included it in a small sketch to be loaded on the esp.

Now is time to put the hand on the keyboard…

Finally i should adapt this sketch to use some interrupt to capture the lcd data from the display.. https://gist.github.com/cnlohr/2b9f8a26e891aa1a118f634cff9d04fe.

https://github.com/EUA/ESP32_LogicAnalyzer

UPDATE:

I was able to get some display output from the keyboard to the new display using the ESP but was an EPIC FAIL!

I had to use i2s and DMA using the CS1 line as a clock for the i2s cirtuit. But the display have 2 CS line and the second i2s circuit can’t be used as another parallel input.

So i moved to Raspberry PI Pico. I had some difficult understanding the state machine, PIO and DMA.

Since the TFT i’ve used have a different resolution, i’ve implemented a simple zoom routine.

This is the source code i wrote.

https://github.com/dpeddi/LCDJunoG

The pinout of the original connector

I’ve finally added a reading of the brightness trimmer and used to change the background color:

The raspberry pi pico mounted inside the keyboard:

The final result… the display mounted uwing a 3d printed support.

The support isn’t perfect. i did some mistake and it needed some rework with a cutter.

Convert a TFA/La Crosse OMO-M-05/TX58UN-IT to TX58-IT and viceversa

I owned both a WS28xx weather station for US and EU market.

The US station works at  915Mhz but the thermo hygro and the receiver was defective.

Now the rain sensor of my EU unit doesn’t work any more.. With the help of a rtl-SDR adapter, I’vee the confirmation that the rain gauge of my US unit still works at 915 mhz.

I compared both the circuit, and they were similar (with the exception of some component that the EU unit had to charge alkaline batteries using solar panel). The only real difference is a soldering point that on the EU unit is shorted.

In the following photo you see the point to solder to make an US unit to work at 868Mhz.

It seems that the thermo hydro  have a similar point.. I hope to find some spare time to give a look to this circuit again…

GruppoGreenPower, statene alla larga

Ho acquistato un coupon di GruppoGreenPower per il rilascio di un attestato di prestazione energetica.

A distanza di 4 mesi dalla prenotazione si è fatto avanti solo un consulente commerciale che ha raccolto i dati in maniera approssimativa, ma con lo scopo principale di vendere servizi, ma non è mai arrivato l’attestato.

In compenso hanno marcato il coupon come utilizzato e rilasciato fattura commerciale per un servizio non goduto..

vergogna!

connect usb hardware to kvm

Since I’ve found really few documentation on connecting usb devices to kvm virtual machine without middle software like spice or libvirt I’ll post what I found here.

 

I’ve found two method but only the 2nd work with usb2serial adapter.

[enlighter lang=”shell”]
USBVIDPID=0403:6001
USBD=””
for line in $(lsusb | grep $USBVIDPID | sed -n “s/Bus 0*\([0-9]*\) Device 0*\([0-9]*\).*/-device usb-host,hostbus=\\1,hostaddr=\\2/p”)
do
USBD=”$USBD $line”
done
[/enlighter]

[enlighter lang=”shell”]
USBVIDPID=0403:6001
cnt=0
USBD=””
killall usbredirserver
for line in $(lsusb | grep $USBVIDPID | sed -n “s/Bus 0*\([0-9]*\) Device 0*\([0-9]*\).*/\\1-\\2/p”)
do
/usr/sbin/usbredirserver -p $(( 4000 + $cnt )) $line >/var/log/kvm/${NAME}-usb-$line.log 2>&1 &
USBD=”$USBD -chardev socket,id=usbredirchardev${cnt},host=localhost,port=$(( 4000 + $cnt )) \
-device usb-redir,chardev=usbredirchardev${cnt},id=usbredirdev${cnt},debug=3″ #,bus=ehci.0,
let cnt=cnt+1
done
[/enlighter]

querying Tivoli Workload Scheduler 8.5 (tws) using web services

Pubblico un esempio di client per l’interrogazione di tws mediante web services utilizzando perl…

#!/bin/perl

#ppm install SOAP::Lite
#ppm install Crypt::SSLeay

use SOAP::Lite
#trace=>’all’
;

#use SOAP::Lite +trace => [qw(method fault headers result debug)];

my $username = ‘user’;
my $password = ‘pass’;
my $host     = ‘host’;

sub SOAP::Transport::HTTP::Client::get_basic_credentials {
return $username => $password;
}

$wsdl = “https://$host:31116/PlanServicesWeb/services/SchedulingFactory/wsdl/SchedulingFactory.wsdl”;

#$service = “https://$host:31116/PlanServicesWeb/services/JobStreamService”;
#$service = “https://$host:31116/PlanServicesWeb/services/JobService”;

$service = “https://$host:31116/PlanServicesWeb/services/SchedulingFactory”;

$ns1 = “http://services.ws.tws.ibm.com/TWS-Scheduling”;
$ns2 = “http://types.ws.tws.ibm.com/TWS-Types”;

my $soap = SOAP::Lite->new( proxy => $service );
$soap->readable(1);
$soap->ns($ns2,’ns2′);
$soap->ns($ns1,’ns1′);

my $result=$soap->call(“queryJobs”,
SOAP::Data->name(“engineName” => undef )->prefix(ns1),
SOAP::Data->name(“filter” => \SOAP::Data->value(
SOAP::Data->name(“details”)->prefix(ns2),
SOAP::Data->name(“minimum”)->prefix(ns2),
SOAP::Data->name(“maximum”)->prefix(ns2),
SOAP::Data->name(“dataType”=>”WORKSTATION_NAME”)->prefix(ns2),
SOAP::Data->name(“value”=> \SOAP::Data->value(
SOAP::Data->name(string=>”WK17”)->prefix(“xsd”),
),
)->prefix(ns2),

SOAP::Data->name(“dataType”=>”JOB_STREAM_NAME”)->prefix(ns2),
SOAP::Data->name(“value”=> \SOAP::Data->value(
SOAP::Data->name(string=>”IGS*”)->prefix(“xsd”),
),
)->prefix(ns2),
),
)->prefix(ns1)->type(“ns2:FilterCriteria”),

);

die $result->faultstring if ($result->fault);

#use Data::Dumper qw(Dumper);
#print Dumper ($result);

foreach my $a ($result->valueof(“//queryJobsResponse/queryJobsReturn/JobInstance”)) {
print sprintf “%-11s %-16s %-16s %-16s %-16s %-5s\n”, $a->{workstationName},
$a->{jobName},
$a->{jobStreamName},
$a->{startTime},
$a->{actualEnd},
$a->{internalStatus};
}

exit;