english blog:
In deze blog ga je lezen hoe je een OBI kunt bouwen. Martin Jansson is het gelukt een tool te bouwen waarmee je gelockte Makita batterijen kunt unlocken. Hiervoor heb ik samen met Maurice Mikkers een verbeterde 3D print ontworpen die een stuk steviger is dan het eerste 3D ontwerp door Well Done Tips. Heb je geen tijd om de tool zelf te bouwen? Dan kun je terecht in mijn webshop om een voor geassembleerde te kopen. Ik bouw deze in batches van 20 stuks. Of ga zelf aan de slag met onderstaande handleiding.
Let op: Deze tool is bedoeld voor diagnose en herstel bij reparaties. Veiligheid staat voorop: gebruik de reset-functie alleen wanneer je zeker weet dat de hardware van de accu weer in veilige staat verkeert.
Benodigdheden

Solderen
Knip de eerste en de drie middelste draadjes van de BL1830 connector weg. Knip daarna de tweede en zesde met genoeg lengte. Knip van de overige draadjes een draadje voor de aarde pen.




Pak een 6.3mm spade connector en druk alle delen plat met een platte tang. Draai met de platte tang het uiteinde er af. Buig het nieuwe uiteinde 90 graden en doe een beetje tin op het uiteinde zodat het draadje goed hecht.


Vergeet niet om de BL1830 connector door de OBI behuizing te doen voordat je hem aan de Arduino nano soldeert.



Arduino flashen
We gaan de Arduino programmeren met de code van Martin Jansson.
Clone de volledige repo als zip: https://github.com/mnh-jansson/open-battery-information/tree/main
Pak deze uit en plaats de open-battery-information/ArduinoOBI/lib/OneWire/ map in C:\Documents\Arduino\libraries\OneWire
Vergeet niet om de oude bootloader te gebruiken, als je nog een oude versie van de Arduino Nano hebt gekocht (vaak het geval bij aankopen vanaf AliExpress.)

#include <Arduino.h>
#include "OneWire2.h"
/** Major version number (X.x.x) */
#define ARDUINO_OBI_VERSION_MAJOR 0
/** Minor version number (x.X.x) */
#define ARDUINO_OBI_VERSION_MINOR 2
/** Patch version number (x.x.X) */
#define ARDUINO_OBI_VERSION_PATCH 1
#ifdef ESP_BUILD
#define ONEWIRE_PIN ESP_OW_PIN
#define ENABLE_PIN ESP_EN_PIN
#else
#define ONEWIRE_PIN 6
#define ENABLE_PIN 8
#endif
OneWire makita(ONEWIRE_PIN);
void cmd_and_read_33(byte *cmd, uint8_t cmd_len, byte *rsp, uint8_t rsp_len) {
int i;
makita.reset();
delayMicroseconds(400);
makita.write(0x33,0);
for (i=0; i < 8; i++) {
delayMicroseconds(90);
rsp[i] = makita.read();
}
for (i=0; i < cmd_len; i++) {
delayMicroseconds(90);
makita.write(cmd[i],0);
}
for (i=8; i < rsp_len + 8; i++) {
delayMicroseconds(90);
rsp[i] = makita.read();
}
}
void cmd_and_read_cc(byte *cmd, uint8_t cmd_len, byte *rsp, uint8_t rsp_len) {
int i;
makita.reset();
delayMicroseconds(400);
makita.write(0xcc,0);
for (i=0; i < cmd_len; i++) {
delayMicroseconds(90);
makita.write(cmd[i],0);
}
for (i=0; i < rsp_len; i++) {
delayMicroseconds(90);
rsp[i] = makita.read();
}
}
void cmd_and_read(byte *cmd, uint8_t cmd_len, byte *rsp, uint8_t rsp_len) {
int i;
makita.reset();
delayMicroseconds(400);
for (i=0; i < cmd_len; i++) {
delayMicroseconds(90);
makita.write(cmd[i],0);
}
for (i=0; i < rsp_len; i++) {
delayMicroseconds(90);
rsp[i] = makita.read();
}
}
void setup() {
Serial.begin (9600);
// One-wire
pinMode(ENABLE_PIN, OUTPUT);
//pinMode(2, OUTPUT);
}
void send_usb(byte *rsp, byte rsp_len) {
for (int i=0; i < rsp_len; i++) {
Serial.write(rsp[i]);
}
}
void read_usb() {
if (Serial.available() >= 4) {
byte start = Serial.read();
byte cmd;
byte len;
byte data[255];
byte rsp[255];
byte rsp_len;
if (start == 0x01) {
len = Serial.read();
rsp_len = Serial.read();
cmd = Serial.read();
if (len > 0){
for (int i = 0; i < len; i++) {
while (Serial.available() < 1);
data[i] = Serial.read();
}
}
}
else {
return;
}
/* Set RTS */
digitalWrite(ENABLE_PIN, HIGH);
delay(400);
switch(cmd) {
case 0x01:
rsp[0] = 0x01;
rsp[2] = ARDUINO_OBI_VERSION_MAJOR;
rsp[3] = ARDUINO_OBI_VERSION_MINOR;
rsp[4] = ARDUINO_OBI_VERSION_PATCH;
break;
case 0x31:
makita.reset();
delayMicroseconds(400);
makita.write(0xcc,0);
delayMicroseconds(90);
makita.write(0x99,0);
delay(400);
makita.reset();
delayMicroseconds(400);
makita.write(0x31,0);
delayMicroseconds(90);
rsp[3] = makita.read();
delayMicroseconds(90);
rsp[2] = makita.read();
delayMicroseconds(90);
break;
case 0x32:
makita.reset();
delayMicroseconds(400);
makita.write(0xcc,0);
delayMicroseconds(90);
makita.write(0x99,0);
delay(400);
makita.reset();
delayMicroseconds(400);
makita.write(0x32,0);
delayMicroseconds(90);
rsp[3] = makita.read();
delayMicroseconds(90);
rsp[2] = makita.read();
delayMicroseconds(90);
break;
case 0x33:
cmd_and_read_33(data, len, &rsp[2], rsp_len);
break;
case 0xCC:
cmd_and_read_cc(data, len, &rsp[2], rsp_len);
break;
default:
rsp_len = 0;
break;
}
rsp[0] = cmd;
rsp[1] = rsp_len;
send_usb(rsp, rsp_len + 2);
digitalWrite(ENABLE_PIN, LOW);
}
}
void loop() {
read_usb();
}
Hierna kun je de obi.exe van https://github.com/mnh-jansson/open-battery-information/releases/tag/v0.2.2 downloaden en kun je de tool gebruiken!


Geen tijd om hem zelf te bouwen?
Koop hem kant en klaar:

Preassembled Open Battery information tool for Makita Accu’s
BMS Tool voor Makita Accu’s – Diagnose & Reset


