Created
November 23, 2020 16:48
-
-
Save circuit4u-medium/5c55c42a2be347a752683eb77070849e to your computer and use it in GitHub Desktop.
FT232H with IS31FL3731
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Import libftd2xx" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
":dep libftd2xx" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"use libftd2xx::{Ftdi, FtdiCommon, BitMode};\n", | |
"use std::time::Duration;" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Connect FTDI FT223H device" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Device information: DeviceInfo { port_open: true, speed: None, device_type: FT232H, vendor_id: 0x0403, product_id: 0x6014, serial_number: FTU85S8E, description: UM232H }\n" | |
] | |
} | |
], | |
"source": [ | |
"let mut ft = Ftdi::new()?;\n", | |
"//let mut ft = Ftdi::with_serial_number(\"MLTS91A\")?; //use serial #\n", | |
"let info = ft.device_info()?;\n", | |
"println!(\"Device information: {:?}\", info);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### **defered**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"ft.close()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Define I2C functions" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"const SCK:u8 = 0x01u8; //AD0 of FT232H\n", | |
"const SDO:u8 = 0x02u8; //AD1 of FT232H\n", | |
"\n", | |
"pub trait I2C: FtdiCommon {\n", | |
" fn init_i2c(&mut self){\n", | |
" self.set_bit_mode(0, BitMode::Reset);\n", | |
" self.set_bit_mode(0, BitMode::Mpsse);\n", | |
" self.write(&[0x8A, 0x8C, 0x86,200,0]); //60MHz; 3-phase clock; set div=200 for 100k I2C clk rate \n", | |
" self.write(&[0x80,SCK+SDO,SCK+SDO]);//set both output high\n", | |
" }\n", | |
" \n", | |
" fn start_i2c(&mut self){ \n", | |
" self.write(&[0x80,SCK+SDO,SCK+SDO]);//set both output high\n", | |
" self.write(&[0x80,SCK,SCK+SDO]); //SDA falling edge\n", | |
" self.write(&[0x80,0,SCK+SDO]); //drop SCK as well\n", | |
" }\n", | |
" \n", | |
" fn stop_i2c(&mut self){ \n", | |
" self.write(&[0x80,0,SCK+SDO]); //set both output low\n", | |
" self.write(&[0x80,SCK,SCK+SDO]); //SCK high first\n", | |
" self.write(&[0x80,SCK+SDO,SCK+SDO]); //SDA rising edge\n", | |
" self.write(&[0x80,0,0]); //set both input; release bus\n", | |
" }\n", | |
" \n", | |
" \n", | |
" fn send_byte(&mut self, byte_to_send: u8) -> bool { \n", | |
" self.write(&[0x11u8, 0,0, byte_to_send,0x80,0,SCK,0x22,0,0x87]); //-ve byte out \n", | |
" let mut buf:[u8;1] = [0;1];\n", | |
" self.read(&mut buf);\n", | |
" self.write(&vec![0x80,SDO, SDO+SCK]);\n", | |
" println!(\"ACK_BIT={}\",buf[0]&1u8);\n", | |
" if buf[0] & 1u8 != 0u8{\n", | |
" return false\n", | |
" }else{\n", | |
" return true\n", | |
" }\n", | |
" }\n", | |
" fn set_reg(&mut self, reg:u8, payload:u8){\n", | |
" self.start_i2c();\n", | |
" self.send_byte(0xe8);\n", | |
" self.send_byte(reg);\n", | |
" self.send_byte(payload);\n", | |
" self.stop_i2c();\n", | |
"\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"impl I2C for Ftdi {}" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Let's explore IS31FL371" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## STEP0: Initial I2C" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.init_i2c()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## STEP1: Get to the right address" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Adafruit IS31FL3731 write I2C address = 0xE8" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.start_i2c();ft.send_byte(0xe8);ft.stop_i2c()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"The device should ACK zero to the correct I2C write address." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## STEP2: Turn ON/OFF" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 1. point to function register page" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0xFD, 0x0B)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 2. turn on (Table 17 page14)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
} | |
], | |
"source": [ | |
"ft.set_reg(0x0a,0x01);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 3. turn off" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
} | |
], | |
"source": [ | |
"ft.set_reg(0x0a,0x00);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Depnding on the default register settings, you may already see a random number of LEDs light up by entering the normal mode." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## STEP3: Setup a frame" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 1. point to Page One/Frame 1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 27, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0xFD, 0x00)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 2. clear " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
} | |
], | |
"source": [ | |
"ft.start_i2c();\n", | |
"ft.send_byte(0xe8); //write address\n", | |
"ft.send_byte(0x00);\n", | |
"for i in 0..18 {\n", | |
" ft.send_byte(0x00);\n", | |
"}\n", | |
"ft.stop_i2c();" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 2. set first row ON (Table 7 page 11)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 30, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0xff)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## STEP4: Enter Picture Mode" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 1. point to Page Nine" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 31, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0xFD, 0x0b)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 2. enter picture mode (Table 9 page 12)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 32, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0x01,0x00)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 3. turn on" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 33, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0x0a, 0x01)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## STEP5: Adjust PWM" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 1. point to Frame 1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 78, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 78, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0xFD, 0x00)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 2. set PWM (Table 6 page 10)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 79, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
} | |
], | |
"source": [ | |
"ft.start_i2c();\n", | |
"ft.send_byte(0xe8);\n", | |
"ft.send_byte(0x24);\n", | |
"for i in 0..16 { //only for the first row\n", | |
" ft.send_byte(0x10); //set 8-bit PWM\n", | |
"}\n", | |
"ft.stop_i2c();" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## STEP6: Blink LED" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 1. enable blink control (Table 12 page 13)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 67, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
} | |
], | |
"source": [ | |
"ft.set_reg(0xFD, 0x0b);ft.set_reg(0x05, 0x0b);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 2. set page 1 blink bits (Table 5 page 10)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 43, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 43, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0xFD, 0x00)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 46, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 46, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0x12,0x0f);ft.set_reg(0x13,0xf0)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"**This blinking funtionn can quickly tell you the bit order.**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## STEP7: breathing funtion (doesn't seem to work in picture mode; wait till auto play mode)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 68, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
} | |
], | |
"source": [ | |
"ft.set_reg(0xfd, 0x0b);" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 77, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 77, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0x08, 0x77);ft.set_reg(0x09, 0x17)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## STEP8: simple animation" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Let's make an effect of LEDs light up from left to right" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 1. clean up registers from 8 frames" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 84, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 84, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"for i in (0..8){\n", | |
" ft.set_reg(0xFD, i);\n", | |
" //clear first\n", | |
" ft.start_i2c();\n", | |
" ft.send_byte(0xe8); //write address\n", | |
" ft.send_byte(0x00);\n", | |
" for i in 0..18 {\n", | |
" ft.send_byte(0x00);\n", | |
" }\n", | |
" ft.stop_i2c();\n", | |
" //set PWM\n", | |
" ft.start_i2c();\n", | |
" ft.send_byte(0xe8);\n", | |
" ft.send_byte(0x24);\n", | |
" for i in 0..16 { //only for the first row\n", | |
" ft.send_byte(0x10); //set 8-bit PWM\n", | |
" }\n", | |
" ft.stop_i2c(); \n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 2. setup 8 frames" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 86, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
} | |
], | |
"source": [ | |
"//set 8 frames\n", | |
"ft.set_reg(0xFD, 0);\n", | |
"ft.set_reg(0x00,0x03);ft.set_reg(0x01,0x00);\n", | |
"ft.set_reg(0xFD, 1);\n", | |
"ft.set_reg(0x00,0x07);ft.set_reg(0x01,0x00);\n", | |
"ft.set_reg(0xFD, 2);\n", | |
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0x00);\n", | |
"ft.set_reg(0xFD, 3);\n", | |
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0x01);\n", | |
"ft.set_reg(0xFD, 4);\n", | |
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0x07);\n", | |
"ft.set_reg(0xFD, 5);\n", | |
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0x3f);\n", | |
"ft.set_reg(0xFD, 6);\n", | |
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0x7f);\n", | |
"ft.set_reg(0xFD, 7);\n", | |
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0xff);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 3. auto frame play mode" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 87, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 87, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0xFD,0x0b)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 93, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 93, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0x02, 0x00);ft.set_reg(0x00,0x08);ft.set_reg(0x03,12)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 4. add breathing effect" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 97, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 97, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0x08, 0x07);ft.set_reg(0x09, 0x10)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 5. disable breathing" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 98, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n", | |
"ACK_BIT=0\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"()" | |
] | |
}, | |
"execution_count": 98, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ft.set_reg(0x09,0x00)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"@webio": { | |
"lastCommId": null, | |
"lastKernelId": null | |
}, | |
"kernelspec": { | |
"display_name": "Rust", | |
"language": "rust", | |
"name": "rust" | |
}, | |
"language_info": { | |
"codemirror_mode": "rust", | |
"file_extension": ".rs", | |
"mimetype": "text/rust", | |
"name": "Rust", | |
"pygment_lexer": "rust", | |
"version": "" | |
}, | |
"toc": { | |
"base_numbering": 1, | |
"nav_menu": {}, | |
"number_sections": true, | |
"sideBar": true, | |
"skip_h1_title": false, | |
"title_cell": "Table of Contents", | |
"title_sidebar": "Contents", | |
"toc_cell": false, | |
"toc_position": {}, | |
"toc_section_display": true, | |
"toc_window_display": false | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment