Moved to separate repos
This commit is contained in:
parent
329baaf9a4
commit
a9865a731a
@ -1,30 +0,0 @@
|
|||||||
# I2C FRAM driver
|
|
||||||
|
|
||||||
This library provides a driver for this FRAM part: https://www.adafruit.com/products/1895
|
|
||||||
|
|
||||||
The memory is accessed one byte at a time. The library provides a utility functions
|
|
||||||
to write an entire buffer.
|
|
||||||
|
|
||||||
## Reading/writing byte
|
|
||||||
|
|
||||||
```
|
|
||||||
let addr = 100
|
|
||||||
i2c_fram.writeByte(addr, 42)
|
|
||||||
let val = i2c_fram.readByte(addr)
|
|
||||||
console.log(`${addr}: ${val}`)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Reading/writing a buffer
|
|
||||||
|
|
||||||
This code will log current time and acceleration in X axis every second.
|
|
||||||
|
|
||||||
```
|
|
||||||
let bufSz = 8
|
|
||||||
for (let addr = 0; addr < 0x8000; addr += bufSz) {
|
|
||||||
let buf = pins.createBuffer(bufSz)
|
|
||||||
buf.setNumber(NumberFormat.Int32LE, 0, input.runningTime())
|
|
||||||
buf.setNumber(NumberFormat.Int32LE, 4, input.acceleration(Dimension.X))
|
|
||||||
i2c_fram.writeBuffer(addr, buf)
|
|
||||||
basic.pause(1000)
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,55 +0,0 @@
|
|||||||
namespace i2c_fram {
|
|
||||||
const devaddr = 0x50;
|
|
||||||
const memend = 0x7fff;
|
|
||||||
|
|
||||||
//% shim=pxtrt::panic
|
|
||||||
function panic(code: number) { }
|
|
||||||
|
|
||||||
function die() { panic(142) }
|
|
||||||
|
|
||||||
export function readByte(addr: number) {
|
|
||||||
if (addr < 0 || addr > memend)
|
|
||||||
die();
|
|
||||||
|
|
||||||
let buf = pins.createBuffer(2)
|
|
||||||
buf[0] = (addr >> 8) & 0xff;
|
|
||||||
buf[1] = addr & 0xff;
|
|
||||||
|
|
||||||
pins.i2cWriteBuffer(devaddr, buf);
|
|
||||||
buf = pins.i2cReadBuffer(devaddr, 1);
|
|
||||||
|
|
||||||
return buf[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
export function writeByte(addr: number, val: number) {
|
|
||||||
if (addr < 0 || addr > memend)
|
|
||||||
die();
|
|
||||||
|
|
||||||
if (val < 0 || val > 0xff)
|
|
||||||
die();
|
|
||||||
|
|
||||||
let buf = pins.createBuffer(3)
|
|
||||||
|
|
||||||
buf[0] = (addr >> 8) & 0xff;
|
|
||||||
buf[1] = addr & 0xff;
|
|
||||||
buf[2] = val;
|
|
||||||
|
|
||||||
pins.i2cWriteBuffer(devaddr, buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function readBuffer(addr: number, length: number) {
|
|
||||||
if (addr < 0 || length < 0 || (addr + length) > memend)
|
|
||||||
die();
|
|
||||||
let buf = pins.createBuffer(length)
|
|
||||||
for (let i = 0; i < length; ++i)
|
|
||||||
buf[i] = readByte(addr + i)
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
|
||||||
export function writeBuffer(addr: number, buf: Buffer) {
|
|
||||||
if (addr < 0 || (addr + buf.length) > memend)
|
|
||||||
die();
|
|
||||||
for (let i = 0; i < buf.length; ++i)
|
|
||||||
writeByte(addr + i, buf[i])
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
i2c_fram.writeByte(100, 42)
|
|
||||||
i2c_fram.writeByte(101, 108)
|
|
||||||
|
|
||||||
function toBuf(arr: number[]) {
|
|
||||||
let buf = pins.createBuffer(arr.length)
|
|
||||||
for (let i = 0; i < arr.length; ++i)
|
|
||||||
buf[i] = arr[i]
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
|
||||||
i2c_fram.writeBuffer(98, toBuf([1, 2, 3, 4, 5, 6, 7]))
|
|
||||||
|
|
||||||
console.log("100:" + i2c_fram.readByte(100))
|
|
||||||
console.log("101:" + i2c_fram.readByte(101))
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "i2c-fram",
|
|
||||||
"description": "AdaFruit I2C FRAM driver for micro:bit",
|
|
||||||
"files": [
|
|
||||||
"README.md",
|
|
||||||
"fram.ts"
|
|
||||||
],
|
|
||||||
"testFiles": [
|
|
||||||
"ftest.ts"
|
|
||||||
],
|
|
||||||
"public": true,
|
|
||||||
"dependencies": {
|
|
||||||
"microbit": "file:../microbit"
|
|
||||||
},
|
|
||||||
"installedVersion": "hhneqa"
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
# NeoPixel driver
|
|
||||||
|
|
||||||
This library provides a driver for various Neo Pixel LED strips,
|
|
||||||
see https://www.adafruit.com/category/168
|
|
||||||
|
|
||||||
NeoPixels consist of a number of RGB LEDs, every one of them controlled
|
|
||||||
separately.
|
|
||||||
|
|
||||||
## Basic usage
|
|
||||||
|
|
||||||
```blocks
|
|
||||||
// Create a NeoPixel driver - specify the number of LEDs:
|
|
||||||
let strip = neopixel.create(DigitalPin.P0, 24)
|
|
||||||
|
|
||||||
// set pixel colors
|
|
||||||
strip.setPixelColor(0, 255, 255, 255) // white
|
|
||||||
strip.setPixelColor(1, 255, 0, 0) // red
|
|
||||||
strip.setPixelColor(2, 0, 255, 0) // green
|
|
||||||
strip.setPixelColor(3, 0, 0, 255) // blue
|
|
||||||
|
|
||||||
// send the data to the strip
|
|
||||||
strip.show()
|
|
||||||
```
|
|
||||||
|
|
||||||
Use `strip.setBrigthness()` to lower the brightness (it's maxed out by default).
|
|
||||||
|
|
||||||
Use `strip.shift()` or `strip.rotate()` to shift the lights around.
|
|
||||||
|
|
||||||
## Example: Using accelerometer to control colors
|
|
||||||
|
|
||||||
This little program will let the position of the microbit control the color of the first LED.
|
|
||||||
This first LED will then get shifted further away every 100ms.
|
|
||||||
|
|
||||||
```blocks
|
|
||||||
let strip = neopixel.create(DigitalPin.P0, 24)
|
|
||||||
while (true) {
|
|
||||||
let x = input.acceleration(Dimension.X) / 2
|
|
||||||
let y = input.acceleration(Dimension.Y) / 2
|
|
||||||
let z = input.acceleration(Dimension.Z) / 2
|
|
||||||
strip.setPixelColor(0, x, y, -z);
|
|
||||||
strip.shift(1);
|
|
||||||
strip.show();
|
|
||||||
basic.pause(100);
|
|
||||||
}
|
|
||||||
```
|
|
@ -1,119 +0,0 @@
|
|||||||
/**
|
|
||||||
* Functions to operate NeoPixel strips.
|
|
||||||
*/
|
|
||||||
//% weight=5 color=#2699BF
|
|
||||||
namespace neopixel {
|
|
||||||
|
|
||||||
//% shim=sendBufferAsm
|
|
||||||
function sendBuffer(buf: Buffer, pin: DigitalPin) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A NeoPixel strip
|
|
||||||
*/
|
|
||||||
export class Strip {
|
|
||||||
buf: Buffer;
|
|
||||||
pin: DigitalPin;
|
|
||||||
brightness: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set give LED to a given color (range 0-255 for r, g, b)
|
|
||||||
*/
|
|
||||||
//% blockId="neopixel_set_pixel_color" block="%strip|set pixel color at %ledoff|red: %red|green: %green|blue: %blue" blockGap=8
|
|
||||||
//% weight=80
|
|
||||||
setPixelColor(ledoff: number, red: number, green: number, blue: number): void {
|
|
||||||
ledoff = ledoff * 3;
|
|
||||||
let br = this.brightness;
|
|
||||||
if (br < 255) {
|
|
||||||
red = (Math.clamp(0, 255, red) * br) >> 8;
|
|
||||||
green = (Math.clamp(0, 255, blue) * br) >> 8;
|
|
||||||
blue = (Math.clamp(0, 255, blue) * br) >> 8;
|
|
||||||
}
|
|
||||||
let buf = this.buf;
|
|
||||||
buf[ledoff + 0] = Math.clamp(0, 255, green);
|
|
||||||
buf[ledoff + 1] = Math.clamp(0, 255, red);
|
|
||||||
buf[ledoff + 2] = Math.clamp(0, 255, blue);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send all the changes to the strip.
|
|
||||||
*/
|
|
||||||
//% blockId="neopixel_show" block="%strip|show" blockGap=8
|
|
||||||
//% weight=79
|
|
||||||
show() {
|
|
||||||
basic.pause(1)
|
|
||||||
sendBuffer(this.buf, this.pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Turn off all LEDs.
|
|
||||||
*/
|
|
||||||
//% blockId="neopixel_clear" block="%strip|clear"
|
|
||||||
//% weight=76
|
|
||||||
clear(): void {
|
|
||||||
this.buf.fill(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the number of pixels declared on the strip
|
|
||||||
*/
|
|
||||||
//% blockId="neopixel_length" block="%strip|length" blockGap=8
|
|
||||||
//% weight=60
|
|
||||||
length() {
|
|
||||||
return this.buf.length / 3
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the brightness of the strip, 0-255. eg: 255
|
|
||||||
*/
|
|
||||||
//% blockId="neopixel_set_brightness" block="%strip|set brightness %brightness" blockGap=8
|
|
||||||
//% weight=59
|
|
||||||
setBrigthness(brightness: number): void {
|
|
||||||
this.brightness = brightness;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shift LEDs forward and clear with zeros.
|
|
||||||
* @param off number of pixels to shift forward, eg: 1
|
|
||||||
*/
|
|
||||||
//% blockId="neopixel_shift" block="%strip|shift pixels forward by %off" blockGap=8
|
|
||||||
//% weight=40
|
|
||||||
shift(off: number = 1): void {
|
|
||||||
this.buf.shift(-off * 3)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rotate LEDs forward.
|
|
||||||
* @param off number of pixels to rotate forward, eg: 1
|
|
||||||
*/
|
|
||||||
//% blockId="neopixel_rotate" block="%strip|rotate pixels forward by %off" blockGap=8
|
|
||||||
//% weight=39
|
|
||||||
rotate(off:number = 1): void {
|
|
||||||
this.buf.rotate(-off * 3)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the pin where the neopixel is connected, defaults to P0.
|
|
||||||
*/
|
|
||||||
setPin(pin: DigitalPin): void {
|
|
||||||
this.pin = pin;
|
|
||||||
pins.digitalWritePin(this.pin, 0)
|
|
||||||
basic.pause(50)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new NeoPixel driver for `numleds` LEDs.
|
|
||||||
* @param pin the pin where the neopixel is connected.
|
|
||||||
* @param numleds number of leds in the strip, eg: 24,30,60,64
|
|
||||||
*/
|
|
||||||
//% blockId="neopixel_create" block="neopixel create|at pin %pin|with %numleds leds"
|
|
||||||
//% weight=90
|
|
||||||
export function create(pin: DigitalPin, numleds: number): Strip {
|
|
||||||
let strip = new Strip();
|
|
||||||
strip.buf = pins.createBuffer(numleds * 3);
|
|
||||||
strip.setBrigthness(255)
|
|
||||||
strip.setPin(pin)
|
|
||||||
return strip;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
let strip = neopixel.create(DigitalPin.P0, 24);
|
|
||||||
let br = 100;
|
|
||||||
strip.setBrigthness(100);
|
|
||||||
input.onButtonPressed(Button.B, () => {
|
|
||||||
br = br + 20;
|
|
||||||
if (br > 255) {
|
|
||||||
br = 5;
|
|
||||||
}
|
|
||||||
strip.setBrigthness(br);
|
|
||||||
});
|
|
||||||
|
|
||||||
let rotationMode = false;
|
|
||||||
input.onButtonPressed(Button.A, () => {
|
|
||||||
rotationMode = !rotationMode;
|
|
||||||
if (rotationMode) {
|
|
||||||
basic.showLeds(`
|
|
||||||
. # # # .
|
|
||||||
# . . . #
|
|
||||||
# . . . #
|
|
||||||
# . . . #
|
|
||||||
. # # # .
|
|
||||||
`);
|
|
||||||
} else {
|
|
||||||
basic.showLeds(`
|
|
||||||
. . # . .
|
|
||||||
. . . # .
|
|
||||||
# # # # #
|
|
||||||
. . . # .
|
|
||||||
. . # . .
|
|
||||||
`);
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
let x = input.acceleration(Dimension.X) / 2
|
|
||||||
let y = input.acceleration(Dimension.Y) / 2
|
|
||||||
let z = input.acceleration(Dimension.Z) / 2
|
|
||||||
if (rotationMode) {
|
|
||||||
strip.rotate();
|
|
||||||
} else {
|
|
||||||
strip.setPixelColor(0, x, y, -z);
|
|
||||||
strip.shift(1);
|
|
||||||
}
|
|
||||||
strip.show();
|
|
||||||
basic.pause(100);
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "neopixel",
|
|
||||||
"description": "AdaFruit NeoPixel driver for micro:bit",
|
|
||||||
"files": [
|
|
||||||
"README.md",
|
|
||||||
"neopixel.ts",
|
|
||||||
"sendbuffer.asm"
|
|
||||||
],
|
|
||||||
"testFiles": [
|
|
||||||
"neotest.ts"
|
|
||||||
],
|
|
||||||
"yotta": {
|
|
||||||
"config": {
|
|
||||||
"microbit-dal": {
|
|
||||||
"bluetooth": {
|
|
||||||
"enabled": 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"public": true,
|
|
||||||
"dependencies": {
|
|
||||||
"microbit": "file:../microbit"
|
|
||||||
},
|
|
||||||
"installedVersion": "fgluxh"
|
|
||||||
}
|
|
@ -1,67 +0,0 @@
|
|||||||
sendBufferAsm:
|
|
||||||
|
|
||||||
push {r4,r5,r6,r7,lr}
|
|
||||||
|
|
||||||
mov r4, r0 ; save buff
|
|
||||||
mov r6, r1 ; save pin
|
|
||||||
|
|
||||||
mov r0, r4
|
|
||||||
bl BufferMethods::length
|
|
||||||
mov r5, r0
|
|
||||||
|
|
||||||
mov r0, r4
|
|
||||||
bl BufferMethods::getBytes
|
|
||||||
mov r4, r0
|
|
||||||
|
|
||||||
; setup pin as digital
|
|
||||||
mov r0, r6
|
|
||||||
movs r1, #0
|
|
||||||
bl pins::digitalWritePin
|
|
||||||
|
|
||||||
; load pin address
|
|
||||||
mov r0, r6
|
|
||||||
bl pins::getPinAddress
|
|
||||||
|
|
||||||
ldr r0, [r0, #8] ; get mbed DigitalOut from MicroBitPin
|
|
||||||
ldr r1, [r0, #4] ; r1-mask for this pin
|
|
||||||
ldr r2, [r0, #16] ; r2-clraddr
|
|
||||||
ldr r3, [r0, #12] ; r3-setaddr
|
|
||||||
|
|
||||||
cpsid i ; disable irq
|
|
||||||
|
|
||||||
b .start
|
|
||||||
|
|
||||||
.nextbit: ; C0
|
|
||||||
str r1, [r3, #0] ; pin := hi C2
|
|
||||||
tst r6, r0 ; C3
|
|
||||||
bne .islate ; C4
|
|
||||||
str r1, [r2, #0] ; pin := lo C6
|
|
||||||
.islate:
|
|
||||||
lsrs r6, r6, #1 ; r6 >>= 1 C7
|
|
||||||
bne .justbit ; C8
|
|
||||||
|
|
||||||
; not just a bit - need new byte
|
|
||||||
adds r4, #1 ; r4++ C9
|
|
||||||
subs r5, #1 ; r5-- C10
|
|
||||||
bcc .stop ; if (r5<0) goto .stop C11
|
|
||||||
.start:
|
|
||||||
movs r6, #0x80 ; reset mask C12
|
|
||||||
nop ; C13
|
|
||||||
|
|
||||||
.common: ; C13
|
|
||||||
str r1, [r2, #0] ; pin := lo C15
|
|
||||||
; always re-load byte - it just fits with the cycles better this way
|
|
||||||
ldrb r0, [r4, #0] ; r0 := *r4 C17
|
|
||||||
b .nextbit ; C20
|
|
||||||
|
|
||||||
.justbit: ; C10
|
|
||||||
; no nops, branch taken is already 3 cycles
|
|
||||||
b .common ; C13
|
|
||||||
|
|
||||||
.stop:
|
|
||||||
str r1, [r2, #0] ; pin := lo
|
|
||||||
cpsie i ; enable irq
|
|
||||||
|
|
||||||
pop {r4,r5,r6,r7,pc}
|
|
||||||
|
|
||||||
|
|
@ -7,8 +7,7 @@
|
|||||||
"libs/microbit",
|
"libs/microbit",
|
||||||
"libs/microbit-radio",
|
"libs/microbit-radio",
|
||||||
"libs/microbit-devices",
|
"libs/microbit-devices",
|
||||||
"libs/microbit-bluetooth",
|
"libs/microbit-bluetooth"
|
||||||
"libs/neopixel"
|
|
||||||
],
|
],
|
||||||
"cloud": {
|
"cloud": {
|
||||||
"workspace": false,
|
"workspace": false,
|
||||||
|
Loading…
Reference in New Issue
Block a user