void setup()
{
pinMode(6,OUTPUT);
}
void loop() {
digitalWrite(6,HIGH);
delay(189);
digitalWrite(6,LOW);
delayMicroseconds(411);
ditigalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH)
delayMicroseconds(103);
digitalWrite(6,LOW);
delayMicroseconds(214);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(214);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(103);
digitalWrite(6,LOW);
delayMicroseconds(130);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(103);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(103);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(103);
digitalWrite(6,LOW);
delayMicroseconds(214);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(103);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(117);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(102);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(116);
digitalWrite(6,LOW);
delayMicroseconds(214);
digitalWrite(6,HIGH);
delayMicroseconds(103);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(103);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(103);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(103);
digitalWrite(6,LOW);
delayMicroseconds(115);
digitalWrite(6,HIGH);
delayMicroseconds(526);
digitalWrite(6,LOW);
delayMicroseconds(204);
digitalWrite(6,HIGH);
delayMicroseconds(96);
digitalWrite(6,LOW);
delayMicroseconds(104);
digitalWrite(6,HIGH);
delayMicroseconds(96);
digitalWrite(6,LOW);
delayMicroseconds(204);
digitalWrite(6,HIGH);
delayMicroseconds(96);
digitalWrite(6,LOW);
delayMicroseconds(204);
digitalWrite(6,HIGH);
delayMicroseconds(96);
digitalWrite(6,LOW);
delayMicroseconds(104);
digitalWrite(6,HIGH);
delayMicroseconds(96);
digitalWrite(6,LOW);
delayMicroseconds(205);
digitalWrite(6,HIGH);
delayMicroseconds(96);
digitalWrite(6,LOW);
delayMicroseconds(105);
digitalWrite(6,HIGH);
delayMicroseconds(96);
digitalWrite(6,LOW);
delayMicroseconds(105);
digitalWrite(6,HIGH);
delayMicroseconds(96);
digitalWrite(6,LOW);
delayMicroseconds(105);
digitalWrite(6,HIGH);
delayMicroseconds(95);
digitalWrite(6,LOW);
delayMicroseconds(206);
digitalWrite(6,HIGH);
delayMicroseconds(95);
digitalWrite(6,LOW);
delayMicroseconds(105);
digitalWrite(6,HIGH);
delayMicroseconds(95);
digitalWrite(6,LOW);
delayMicroseconds(106);
digitalWrite(6,HIGH);
delayMicroseconds(95);
digitalWrite(6,LOW);
delayMicroseconds(206);
digitalWrite(6,HIGH);
delayMicroseconds(94);
digitalWrite(6,LOW);
delayMicroseconds(106);
digitalWrite(6,HIGH);
delayMicroseconds(94);
digitalWrite(6,LOW);
delayMicroseconds(206);
digitalWrite(6,HIGH);
delayMicroseconds(94);
digitalWrite(6,LOW);
delayMicroseconds(206);
}
This is just a guess, but I suspect some of the older GW tools were a bit looser on their timing requirements, so the microsecond precision signal generated by an Arduino worked. I suspect newer tools implement another Renesas chip and the timing requirements are now in the nanosecond range which the Arduino can't do reliability via the delay function.
This is just a guess, but I suspect some of the older GW tools were a bit looser on their timing requirements, so the microsecond precision signal generated by an Arduino worked. I suspect newer tools implement another Renesas chip and the timing requirements are now in the nanosecond range which the Arduino can't do reliability via the delay function.My guess is that the line is a bidirectional bus (similar to 1Wire) and therefore imitating the waveform would only work if the playback starts at exactly the right time. Perhaps make a small inductive pickup to tell which end is driving the line while reverse engineering with the scope?
Good thought. Bidirectional communication would also explain the two different levels of low pulses (600mv and 200mv).
// written 5/26/2020
// Working battery interface signal from the "Omega" port
// of a Greenworks Pro 60V batter
//20.05.2021 BornToRepair mod:
//reply frame removed
//pin6 input mode enabled beetween query frames
//query cycling each 2000ms
#define PIN 6
void setup()
{
pinMode(PIN, OUTPUT);
}
void loop()
{
for(uint8_t a = 0; a < 10; a++)
{
digitalWrite(PIN, HIGH);
//Delay 188,000us
for(uint8_t i = 0; i < 188; i++)
{
delayMicroseconds(1000);
}
pinMode(PIN, OUTPUT);
digitalWrite(PIN, LOW);
delayMicroseconds(400);
for(uint8_t i = 0; i < 4; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
for(uint8_t i = 0; i < 10; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
delayMicroseconds(100);
for(uint8_t i = 0; i < 1; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
// 5
for(uint8_t i = 0; i < 3; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
delayMicroseconds(100);
for(uint8_t i = 0; i < 2; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
for(uint8_t i = 0; i < 1; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
for(uint8_t i = 0; i < 1; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
for(uint8_t i = 0; i < 3; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
pinMode(PIN, INPUT);
}
for(uint8_t a = 0; a < 10; a++)
{
digitalWrite(PIN, HIGH);
//Delay 188,000us
for(uint8_t i = 0; i < 188; i++)
{
delayMicroseconds(1000);
}
pinMode(PIN, OUTPUT);
digitalWrite(PIN, LOW);
delayMicroseconds(400);
for(uint8_t i = 0; i < 3; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
for(uint8_t i = 0; i < 9; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
delayMicroseconds(100);
for(uint8_t i = 0; i < 1; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
// 5
for(uint8_t i = 0; i < 4; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
delayMicroseconds(100);
for(uint8_t i = 0; i < 4; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
for(uint8_t i = 0; i < 3; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
pinMode(PIN, INPUT);
}
}
QuoteGood thought. Bidirectional communication would also explain the two different levels of low pulses (600mv and 200mv).
Definitely it is like you said.
I have bought Powerworks 60V mower cheap without battery.
My idea was to run it with 3x Makita 18V batteries which I have a lot.
To make it run I have modified Arduino sketch available on Endless sphere thread.
I simply removed second part of a script to check if the answer form mower will still appear on a bus. Indded it was.
Unfortunatley this was not enough for reliable opration. Mover turns off after 1-2 min of running with 6 loud beeps.
Reading carefull this thread and endless sphere theread I figure out that query frame is not the same all the time.
Dumb luck I was able to generate different random query and sitll receive answer from mower.
[url]https://youtu.be/Y7Tlfim-A8w[/url]
I tried to alternate this query every 2sec. and to my surprise it works!
I was able to mow grass in my entire garden for ~60min.
[url]https://youtu.be/ER4f0lgI0SA[/url]
Preliminarly I was worried about lack of power in battery powered mower.
Mower draws only ~5A continous, 10A max and this reflecs to only 300 - 600W of power, compared to 2-3kW gas powered mowers.
However it turns to be opposite - gas powered mowers seems to be overpowered for such simple task as grass cutting ;-).
BTW. to power Arduino form 5V you do not need separete DC/DC 60V to 5V converter.
5V is available at motor hall sensor harness!
Here is my working Arduino sketch:Code: [Select]// written 5/26/2020
// Working battery interface signal from the "Omega" port
// of a Greenworks Pro 60V batter
//20.05.2021 BornToRepair mod:
//reply frame removed
//pin6 input mode enabled beetween query frames
//query cycling each 2000ms
#define PIN 6
void setup()
{
pinMode(PIN, OUTPUT);
}
void loop()
{
for(uint8_t a = 0; a < 10; a++)
{
digitalWrite(PIN, HIGH);
//Delay 188,000us
for(uint8_t i = 0; i < 188; i++)
{
delayMicroseconds(1000);
}
pinMode(PIN, OUTPUT);
digitalWrite(PIN, LOW);
delayMicroseconds(400);
for(uint8_t i = 0; i < 4; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
for(uint8_t i = 0; i < 10; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
delayMicroseconds(100);
for(uint8_t i = 0; i < 1; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
// 5
for(uint8_t i = 0; i < 3; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
delayMicroseconds(100);
for(uint8_t i = 0; i < 2; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
for(uint8_t i = 0; i < 1; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
for(uint8_t i = 0; i < 1; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
for(uint8_t i = 0; i < 3; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
pinMode(PIN, INPUT);
}
for(uint8_t a = 0; a < 10; a++)
{
digitalWrite(PIN, HIGH);
//Delay 188,000us
for(uint8_t i = 0; i < 188; i++)
{
delayMicroseconds(1000);
}
pinMode(PIN, OUTPUT);
digitalWrite(PIN, LOW);
delayMicroseconds(400);
for(uint8_t i = 0; i < 3; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
for(uint8_t i = 0; i < 9; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
delayMicroseconds(100);
for(uint8_t i = 0; i < 1; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
// 5
for(uint8_t i = 0; i < 4; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
delayMicroseconds(100);
for(uint8_t i = 0; i < 4; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(200);
}
for(uint8_t i = 0; i < 3; i++)
{
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
}
pinMode(PIN, INPUT);
}
}
I*RP948G
9019
F6216
C009B2
020FZ02
Great info in this thread. I have a GW 60V trimmer that I bought for parts, and can confirm that when powered from a 66V battery with just + and - terminals, it runs for ~3sec then powers off. No audible beeper.
This is the trimmer with motor down at the bottom of the shaft. The motor is an outrunner, direct drive to the trimmer spool, marked Globe 60VDC. It has no hall sensors, just the 3 motor phase wires. Motor has forced cooling, unlike most hobby outrunners. Motor bearings come with a slight bit of play from the factory (maybe I got a bad unit, but the play seems in the bearings themselves). Discovering that it is sensorless, and only runs for 3 seconds without GW battery authentication - I don't think it's ideal for my project.
Question for you folks - if I buy a dewalt 60V tool, will it run from a generic 60VDC source, or does it also try to 'authenticate' the battery?
Great info in this thread. I have a GW 60V trimmer that I bought for parts, and can confirm that when powered from a 66V battery with just + and - terminals, it runs for ~3sec then powers off. No audible beeper.
This is the trimmer with motor down at the bottom of the shaft. The motor is an outrunner, direct drive to the trimmer spool, marked Globe 60VDC. It has no hall sensors, just the 3 motor phase wires. Motor has forced cooling, unlike most hobby outrunners. Motor bearings come with a slight bit of play from the factory (maybe I got a bad unit, but the play seems in the bearings themselves). Discovering that it is sensorless, and only runs for 3 seconds without GW battery authentication - I don't think it's ideal for my project.
Question for you folks - if I buy a dewalt 60V tool, will it run from a generic 60VDC source, or does it also try to 'authenticate' the battery?
Hi there,
I have various Greenworks devices that I would like to use with other batteries.
I looked at the signal and wrote a small program based on it.
the program is designed in such a way that you can easily use other battery types.
unfortunately i don't have 60v and 80v batteries and can't reproduce the signal for them.
since the signal pauses are always the same length, i only need the pulse lengths and number of pulses, and what for battery and manufacturers.
like 1x400 3x200 13x102 .....
then i can include it in the program, maybe we can create a list with which manufacturers and battery types it works?
here the program
https://github.com/softwarecrash/OmegaFaker
by interesed, i think about a self learn function or a function to read out the battery and report the sequel by serial