Six months of design iterations, sourcing headaches, and a broken oscilloscope later — I am pleased to share a hardware module I designed to extend the Flipper ecosystem for RF security research. This write-up covers the motivation, engineering challenges, capabilities, and responsible-disclosure principles behind the project — and a frank look at a vulnerability that is very much alive in the Maldives today. Left: 3D render of final PCB · Right: Altium Designer PCB layout view Why I Built It The trigger was reading the original MouseJack disclosure by Bastille Networks. It made me realize that a class of peripherals most people assume to be harmless — the cheap wireless mouse on your desk — can be weaponized from a car park. I wanted a research platform small enough to carry in a jacket pocket, native to the Flipper Zero ecosystem, and capable of passive scanning, protocol analysis, and controlled lab tests. What I...
When you use microcontrollers and you are out of PIN's to connect some LED's for status or when you want to drive a binary clock with few pins left in microcontroller, there is a way that can solve this issue.
Its called charlieplexing and if you know multiplexing you will have some idea of how it works. I will do an example using Arduino for demonstration.
Charlieplexing is a method to drive multiple LED's with few pins available in your microcontroller.
Here is the formula to calculate how many LEDs can be drive from N number of pins.
Number of LED's = No. of PINS available ( No. of PINS available - 1)
For example you have only 3 pins left in Arduino and you want to know how many LED's can be drive.
Number of LED's = 3(3-1)
Number of LED's = 3(2)
Number of LED's = 6
So from 3 PINS you can drive 6 LED's.
Since arduino have tri-state output (INPUT, HIGH and LOW) its easy to drive the LED's using this method.
L = LOW (make out pin as LOW)
H = HIGH (make out pin as HIGH)
I = INPUT (make pin as INPUT) so this pin will be an open circuit
To drive LED 1
You have to make pin 2 and 3 as output pins. Pin 4 as an input.
So when you sent pin 2 = LOW and pin 3 = HIGH and leave pin 4 as an INPUT, the LED 1 will light up.
To drive LED 3
You have to make pin 3 and 4 as output pins. Pin 2 as an input.
So when you sent pin 3 = LOW and pin 4 = HIGH and leave pin 2 as an INPUT, the LED 3 will light up.
Here is an arduino test code that i have written for test charlieplexing.
#define L1 2
#define L2 3
#define L3 4
int delays = 400;
void setup() {
}
void loop() {
pinMode(L1,OUTPUT);
pinMode(L2,OUTPUT);
pinMode(L3,INPUT);
digitalWrite(L1,LOW);
digitalWrite(L2,HIGH);
delay(delays);
digitalWrite(L1,HIGH);
digitalWrite(L2,LOW);
delay(delays);
pinMode(L1,INPUT);
pinMode(L2,OUTPUT);
pinMode(L3,OUTPUT);
digitalWrite(L2,HIGH);
digitalWrite(L3,LOW);
delay(delays);
digitalWrite(L2,LOW);
digitalWrite(L3,HIGH);
delay(delays);
pinMode(L1,OUTPUT);
pinMode(L2,INPUT);
pinMode(L3,OUTPUT);
digitalWrite(L1,LOW);
digitalWrite(L3,HIGH);
delay(delays);
digitalWrite(L1,HIGH);
digitalWrite(L3,LOW);
delay(delays);
}
Its called charlieplexing and if you know multiplexing you will have some idea of how it works. I will do an example using Arduino for demonstration.
Charlieplexing is a method to drive multiple LED's with few pins available in your microcontroller.
Here is the formula to calculate how many LEDs can be drive from N number of pins.
Number of LED's = No. of PINS available ( No. of PINS available - 1)
For example you have only 3 pins left in Arduino and you want to know how many LED's can be drive.
Number of LED's = 3(3-1)
Number of LED's = 3(2)
Number of LED's = 6
So from 3 PINS you can drive 6 LED's.
Since arduino have tri-state output (INPUT, HIGH and LOW) its easy to drive the LED's using this method.
![]() |
| how leds are connected to 3 pins of an arduino |
![]() |
| Truth table of how its drive |
H = HIGH (make out pin as HIGH)
I = INPUT (make pin as INPUT) so this pin will be an open circuit
To drive LED 1
You have to make pin 2 and 3 as output pins. Pin 4 as an input.
So when you sent pin 2 = LOW and pin 3 = HIGH and leave pin 4 as an INPUT, the LED 1 will light up.
To drive LED 3
You have to make pin 3 and 4 as output pins. Pin 2 as an input.
So when you sent pin 3 = LOW and pin 4 = HIGH and leave pin 2 as an INPUT, the LED 3 will light up.
Here is an arduino test code that i have written for test charlieplexing.
#define L1 2
#define L2 3
#define L3 4
int delays = 400;
void setup() {
}
void loop() {
pinMode(L1,OUTPUT);
pinMode(L2,OUTPUT);
pinMode(L3,INPUT);
digitalWrite(L1,LOW);
digitalWrite(L2,HIGH);
delay(delays);
digitalWrite(L1,HIGH);
digitalWrite(L2,LOW);
delay(delays);
pinMode(L1,INPUT);
pinMode(L2,OUTPUT);
pinMode(L3,OUTPUT);
digitalWrite(L2,HIGH);
digitalWrite(L3,LOW);
delay(delays);
digitalWrite(L2,LOW);
digitalWrite(L3,HIGH);
delay(delays);
pinMode(L1,OUTPUT);
pinMode(L2,INPUT);
pinMode(L3,OUTPUT);
digitalWrite(L1,LOW);
digitalWrite(L3,HIGH);
delay(delays);
digitalWrite(L1,HIGH);
digitalWrite(L3,LOW);
delay(delays);
}
hope this will help you.


Comments