CP and Arduino Prop-Maker Feather examples
Adding CircuitPython and Arduino examples for the RP2040 Prop-Maker Feather
This commit is contained in:
parent
6ea5c0eedb
commit
fb80908daf
6 changed files with 2562 additions and 0 deletions
|
|
@ -0,0 +1,142 @@
|
||||||
|
#include <Adafruit_NeoPixel.h>
|
||||||
|
#include <Adafruit_LIS3DH.h>
|
||||||
|
#include <Adafruit_Sensor.h>
|
||||||
|
#include <107-Arduino-Servo-RP2040.h>
|
||||||
|
|
||||||
|
Adafruit_NeoPixel strip(60, PIN_EXTERNAL_NEOPIXELS, NEO_GRB + NEO_KHZ800);
|
||||||
|
|
||||||
|
Adafruit_LIS3DH lis = Adafruit_LIS3DH();
|
||||||
|
|
||||||
|
static _107_::Servo servo_0;
|
||||||
|
|
||||||
|
uint8_t x = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// core1 setup
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
if (! lis.begin(0x18)) { // change this to 0x19 for alternative i2c address
|
||||||
|
Serial.println("Couldnt start LIS3DH");
|
||||||
|
while (1) yield();
|
||||||
|
}
|
||||||
|
|
||||||
|
lis.setRange(LIS3DH_RANGE_2_G);
|
||||||
|
|
||||||
|
pinMode(PIN_EXTERNAL_POWER, OUTPUT);
|
||||||
|
digitalWrite(PIN_EXTERNAL_POWER, HIGH);
|
||||||
|
|
||||||
|
strip.begin();
|
||||||
|
strip.show();
|
||||||
|
strip.setBrightness(50);
|
||||||
|
|
||||||
|
pinMode(PIN_EXTERNAL_BUTTON, INPUT_PULLUP);
|
||||||
|
|
||||||
|
servo_0.attach(PIN_EXTERNAL_SERVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
delay(10);
|
||||||
|
x++;
|
||||||
|
for(int32_t i=0; i< strip.numPixels(); i++) {
|
||||||
|
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + x) & 255));
|
||||||
|
}
|
||||||
|
strip.show();
|
||||||
|
// Print X Y & Z accelerometer data
|
||||||
|
if (x % 10 == 0) {
|
||||||
|
// every 100ms
|
||||||
|
sensors_event_t event;
|
||||||
|
lis.getEvent(&event);
|
||||||
|
/* Display the results (acceleration is measured in m/s^2) */
|
||||||
|
Serial.print("Accel X: "); Serial.print(event.acceleration.x);
|
||||||
|
Serial.print(" \tY: "); Serial.print(event.acceleration.y);
|
||||||
|
Serial.print(" \tZ: "); Serial.print(event.acceleration.z);
|
||||||
|
Serial.println(" m/s^2 ");
|
||||||
|
Serial.println(x);
|
||||||
|
}
|
||||||
|
// external button press disable external power
|
||||||
|
if (! digitalRead(PIN_EXTERNAL_BUTTON)) {
|
||||||
|
Serial.println("External button pressed");
|
||||||
|
digitalWrite(PIN_EXTERNAL_POWER, LOW);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
digitalWrite(PIN_EXTERNAL_POWER, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x < 128) {
|
||||||
|
// forward
|
||||||
|
servo_0.writeMicroseconds(map(x, 0, 127, 1000, 2000));
|
||||||
|
} else {
|
||||||
|
// and back
|
||||||
|
servo_0.writeMicroseconds(map(x-128, 0, 127, 2000, 1000));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Wheel(byte WheelPos) {
|
||||||
|
WheelPos = 255 - WheelPos;
|
||||||
|
if(WheelPos < 85) {
|
||||||
|
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
|
||||||
|
}
|
||||||
|
if(WheelPos < 170) {
|
||||||
|
WheelPos -= 85;
|
||||||
|
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
|
||||||
|
}
|
||||||
|
WheelPos -= 170;
|
||||||
|
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// audio runs on core 2!
|
||||||
|
|
||||||
|
#include <I2S.h>
|
||||||
|
|
||||||
|
#include "boot.h"
|
||||||
|
#include "hithere.h"
|
||||||
|
|
||||||
|
struct {
|
||||||
|
const uint8_t *data;
|
||||||
|
uint32_t len;
|
||||||
|
uint32_t rate;
|
||||||
|
} sound[] = {
|
||||||
|
hithereAudioData, sizeof(hithereAudioData), hithereSampleRate,
|
||||||
|
bootAudioData , sizeof(bootAudioData) , bootSampleRate,
|
||||||
|
};
|
||||||
|
#define N_SOUNDS (sizeof(sound) / sizeof(sound[0]))
|
||||||
|
|
||||||
|
I2S i2s(OUTPUT);
|
||||||
|
|
||||||
|
uint8_t sndIdx = 0;
|
||||||
|
|
||||||
|
|
||||||
|
void setup1(void) {
|
||||||
|
i2s.setBCLK(PIN_I2S_BIT_CLOCK);
|
||||||
|
i2s.setDATA(PIN_I2S_DATA);
|
||||||
|
i2s.setBitsPerSample(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop1() {
|
||||||
|
Serial.printf("Core #2 Playing audio clip #%d\n", sndIdx);
|
||||||
|
play_i2s(sound[sndIdx].data, sound[sndIdx].len, sound[sndIdx].rate);
|
||||||
|
delay(5000);
|
||||||
|
if(++sndIdx >= N_SOUNDS) sndIdx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void play_i2s(const uint8_t *data, uint32_t len, uint32_t rate) {
|
||||||
|
|
||||||
|
// start I2S at the sample rate with 16-bits per sample
|
||||||
|
if (!i2s.begin(rate)) {
|
||||||
|
Serial.println("Failed to initialize I2S!");
|
||||||
|
delay(500);
|
||||||
|
i2s.end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(uint32_t i=0; i<len; i++) {
|
||||||
|
uint16_t sample = (uint16_t)data[i] * 32;
|
||||||
|
// write the same sample twice, once for left and once for the right channel
|
||||||
|
i2s.write(sample);
|
||||||
|
i2s.write(sample);
|
||||||
|
}
|
||||||
|
i2s.end();
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Binary file not shown.
|
|
@ -0,0 +1,85 @@
|
||||||
|
# SPDX-FileCopyrightText: 2023 Liz Clark for Adafruit Industries
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
'''RP2040 Prop-Maker Feather Example'''
|
||||||
|
|
||||||
|
import time
|
||||||
|
import board
|
||||||
|
import audiocore
|
||||||
|
import audiobusio
|
||||||
|
import audiomixer
|
||||||
|
import pwmio
|
||||||
|
from digitalio import DigitalInOut, Direction, Pull
|
||||||
|
import neopixel
|
||||||
|
from adafruit_led_animation.animation.rainbow import Rainbow
|
||||||
|
from adafruit_motor import servo
|
||||||
|
import adafruit_lis3dh
|
||||||
|
|
||||||
|
# enable external power pin
|
||||||
|
# provides power to the external components
|
||||||
|
external_power = DigitalInOut(board.EXTERNAL_POWER)
|
||||||
|
external_power.direction = Direction.OUTPUT
|
||||||
|
external_power.value = True
|
||||||
|
|
||||||
|
# i2s playback
|
||||||
|
wave_file = open("StreetChicken.wav", "rb")
|
||||||
|
wave = audiocore.WaveFile(wave_file)
|
||||||
|
audio = audiobusio.I2SOut(board.I2S_BIT_CLOCK, board.I2S_WORD_SELECT, board.I2S_DATA)
|
||||||
|
mixer = audiomixer.Mixer(voice_count=1, sample_rate=22050, channel_count=1,
|
||||||
|
bits_per_sample=16, samples_signed=True)
|
||||||
|
audio.play(mixer)
|
||||||
|
mixer.voice[0].play(wave, loop=True)
|
||||||
|
mixer.voice[0].level = 0.5
|
||||||
|
|
||||||
|
# servo control
|
||||||
|
pwm = pwmio.PWMOut(board.EXTERNAL_SERVO, duty_cycle=2 ** 15, frequency=50)
|
||||||
|
prop_servo = servo.Servo(pwm)
|
||||||
|
angle = 0
|
||||||
|
angle_plus = True
|
||||||
|
|
||||||
|
# external button
|
||||||
|
switch = DigitalInOut(board.EXTERNAL_BUTTON)
|
||||||
|
switch.direction = Direction.INPUT
|
||||||
|
switch.pull = Pull.UP
|
||||||
|
switch_state = False
|
||||||
|
|
||||||
|
# external neopixels
|
||||||
|
num_pixels = 30
|
||||||
|
pixels = neopixel.NeoPixel(board.EXTERNAL_NEOPIXELS, num_pixels)
|
||||||
|
pixels.brightness = 0.3
|
||||||
|
rainbow = Rainbow(pixels, speed=0.05, period=2)
|
||||||
|
|
||||||
|
# onboard LIS3DH
|
||||||
|
i2c = board.I2C()
|
||||||
|
int1 = DigitalInOut(board.ACCELEROMETER_INTERRUPT)
|
||||||
|
lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, int1=int1)
|
||||||
|
lis3dh.range = adafruit_lis3dh.RANGE_2_G
|
||||||
|
|
||||||
|
while True:
|
||||||
|
# rainbow animation on external neopixels
|
||||||
|
rainbow.animate()
|
||||||
|
# read and print LIS3DH values
|
||||||
|
x, y, z = [
|
||||||
|
value / adafruit_lis3dh.STANDARD_GRAVITY for value in lis3dh.acceleration
|
||||||
|
]
|
||||||
|
print(f"x = {x:.3f} G, y = {y:.3f} G, z = {z:.3f} G")
|
||||||
|
# move servo back and forth
|
||||||
|
prop_servo.angle = angle
|
||||||
|
if angle_plus:
|
||||||
|
angle += 5
|
||||||
|
else:
|
||||||
|
angle -= 5
|
||||||
|
if angle == 180:
|
||||||
|
angle_plus = False
|
||||||
|
elif angle == 0:
|
||||||
|
angle_plus = True
|
||||||
|
# if the switched is pressed, turn off power to external components
|
||||||
|
if not switch.value and switch_state is False:
|
||||||
|
external_power.value = False
|
||||||
|
switch_state = True
|
||||||
|
if switch.value and switch_state is True:
|
||||||
|
external_power.value = True
|
||||||
|
switch_state = False
|
||||||
|
|
||||||
|
time.sleep(0.02)
|
||||||
Loading…
Reference in a new issue