yahboom_mbit/main.ts

1098 lines
33 KiB
TypeScript

/*
Copyright (C): 2010-2019, Shenzhen Yahboom Tech
modified from liusen
load dependency
"mbit": "file:../pxt-mbit"
*/
//% color="#C814B8" weight=25 icon="\uf1d4"
namespace mbit_Display {
export enum enColor {
//% blockId="OFF" block="off"
OFF = 0,
//% blockId="Red" block="red"
Red,
//% blockId="Green" block="green"
Green,
//% blockId="Blue" block="blue"
Blue,
//% blockId="White" block="white"
White,
//% blockId="Cyan" block="cyan"
Cyan,
//% blockId="Pinkish" block="magenta"
Pinkish,
//% blockId="Yellow" block="yellow"
Yellow,
}
export enum enLED1 {
//% blockId="OFF" block="off"
OFF = 0,
//% blockId="ON" block="on"
ON =1
}
//% blockId=mbit_LED1 block="LED1|pin %pin|value %value"
//% weight=5
//% blockGap=8
//% color="#C814B8"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=1
export function LED1(pin: DigitalPin, value: enLED1): void {
pins.digitalWritePin(pin, value);
}
//% blockId=mbit_LED2 block="LED2|pin %pin|value %value"
//% weight=4
//% blockGap=8
//% color="#C814B8"
//% value.min=0 value.max=255
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=2
export function LED2(pin: AnalogPin, value: number): void {
pins.analogWritePin(pin, value * 1024 / 256);
}
//% blockId=mbit_BreathLED block="BreathLED|pin %pin"
//% weight=3
//% blockGap=8
//% color="#C814B8"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=3
export function BreathLED(pin: AnalogPin): void {
for (let i: number = 0; i < 1023; i++) {
pins.analogWritePin(pin, i);
//basic.pause(1);
control.waitMicros(1000);
}
basic.pause(10);
for (let i: number = 1023; i > 0; i--) {
pins.analogWritePin(pin, i);
//basic.pause(1);
control.waitMicros(1000);
}
}
//% blockId=mbit_RGB block="RGB|pin1 %pin1|pin2 %pin2|pin3 %pin3|value1 %value1|value2 %value2|value3 %value3"
//% weight=2
//% blockGap=8
//% color="#C814B8"
//% value1.min=0 value1.max=255 value2.min=0 value2.max=255 value3.min=0 value3.max=255
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
export function RGB(pin1: AnalogPin, pin2: AnalogPin, pin3: AnalogPin, value1: number, value2: number, value3: number): void {
pins.analogWritePin(pin1, value1 * 1024 / 256);
pins.analogWritePin(pin2, value2 * 1024 / 256);
pins.analogWritePin(pin3, value3 * 1024 / 256);
}
//% blockId=mbit_RGB2 block="RGB|pin1 %pin1|pin2 %pin2|pin3 %pin3|value %value"
//% weight=1
//% blockGap=8
//% color="#C814B8"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
export function RGB2(pin1: DigitalPin, pin2: DigitalPin, pin3: DigitalPin, value: enColor): void {
switch (value) {
case enColor.OFF: {
pins.digitalWritePin(pin1, 0);
pins.digitalWritePin(pin2, 0);
pins.digitalWritePin(pin3, 0);
break;
}
case enColor.Red: {
pins.digitalWritePin(pin1, 1);
pins.digitalWritePin(pin2, 0);
pins.digitalWritePin(pin3, 0);
break;
}
case enColor.Green: {
pins.digitalWritePin(pin1, 0);
pins.digitalWritePin(pin2, 1);
pins.digitalWritePin(pin3, 0);
break;
}
case enColor.Blue: {
pins.digitalWritePin(pin1, 0);
pins.digitalWritePin(pin2, 0);
pins.digitalWritePin(pin3, 1);
break;
}
case enColor.White: {
pins.digitalWritePin(pin1, 1);
pins.digitalWritePin(pin2, 1);
pins.digitalWritePin(pin3, 1);
break;
}
case enColor.Cyan: {
pins.digitalWritePin(pin1, 0);
pins.digitalWritePin(pin2, 1);
pins.digitalWritePin(pin3, 1);
break;
}
case enColor.Pinkish: {
pins.digitalWritePin(pin1, 1);
pins.digitalWritePin(pin2, 0);
pins.digitalWritePin(pin3, 1);
break;
}
case enColor.Yellow: {
pins.digitalWritePin(pin1, 1);
pins.digitalWritePin(pin2, 1);
pins.digitalWritePin(pin3, 0);
break;
}
}
}
}
/*****************************************************************************************************************************************
* 传感器类 *****************************************************************************************************************************
****************************************************************************************************************************************/
//% color="#87CEEB" weight=24 icon="\uf1b6"
namespace mbit_Sensor {
export enum enVoice {
//% blockId="Voice" block="sound"
Voice = 0,
//% blockId="NoVoice" block="silence"
NoVoice = 1
}
export enum enIR {
//% blockId="Get" block="detected"
Get = 0,
//% blockId="NoVoice" block="undetected"
NoGet = 1
}
//% blockId=mbit_Voice_Sensor block="Voice_Sensor|pin %pin|value %value"
//% weight=100
//% blockGap=10
//% color="#87CEEB"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
export function Voice_Sensor(pin: DigitalPin, value: enVoice): boolean {
pins.setPull(pin, PinPullMode.PullUp);
if (pins.digitalReadPin(pin) == value) {
return true;
}
else {
return false;
}
}
function IR_send_38k() {
for (let i: number = 0; i < 8; i++) {
pins.digitalWritePin(DigitalPin.P9, 1);
control.waitMicros(13);
pins.digitalWritePin(DigitalPin.P9, 0);
control.waitMicros(13);
}
}
//% blockId=mbit_IR_Sensor block="IR_Sensor|pin %pin| |%value|obstacle"
//% weight=100
//% blockGap=10
//% color="#87CEEB"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
export function IR_Sensor(pin: DigitalPin, value: enIR): boolean {
pins.setPull(pin, PinPullMode.PullUp);
//IR_send_38k();
if (pins.digitalReadPin(pin) == value) {
return true;
}
else {
return false;
}
}
//% blockId=mbit_IR_Send block="IR_Send|pin %pin"
//% weight=100
//% blockGap=10
//% color="#87CEEB"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
export function IR_Send(pin: DigitalPin): void {
IR_send_38k();
}
//% blockId=mbit_ultrasonic block="Ultrasonic|Trig %Trig|Echo %Echo"
//% color="#87CEEB"
//% weight=100
//% blockGap=10
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
export function Ultrasonic(Trig: DigitalPin, Echo: DigitalPin): number {
// send pulse
pins.setPull(Trig, PinPullMode.PullNone);
pins.digitalWritePin(Trig, 0);
control.waitMicros(2);
pins.digitalWritePin(Trig, 1);
control.waitMicros(15);
pins.digitalWritePin(Trig, 0);
// read pulse
let d = pins.pulseIn(Echo, PulseValue.High, 23200);
return d / 58;
}
}
/*****************************************************************************************************************************************
* Input *****************************************************************************************************************************
****************************************************************************************************************************************/
//% color="#808080" weight=23 icon="\uf11c"
namespace mbit_Input {
export enum enRocker {
//% blockId="Nostate" block="No"
Nostate = 0,
//% blockId="Up" block="up"
Up,
//% blockId="Down" block="down"
Down,
//% blockId="Left" block="left"
Left,
//% blockId="Right" block="right"
Right,
//% blockId="Press" block="press"
Press
}
export enum enTouch {
//% blockId="NoTouch" block="untouched"
NoTouch = 0,
//% blockId="Touch" block="touched"
Touch = 1
}
export enum enButton {
//% blockId="Press" block="press"
Press = 0,
//% blockId="Realse" block="release"
Realse = 1
}
//% blockId=mbit_TouchPad block="TouchPad|pin %pin|value %value"
//% weight=100
//% blockGap=10
//% color="#808080"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=5
export function TouchPad(pin: DigitalPin, value: enTouch): boolean {
pins.setPull(pin, PinPullMode.PullUp);
if (pins.digitalReadPin(pin) == value) {
return true;
}
else {
return false;
}
}
//% blockId=mbit_Rocker block="Rocker|VRX %pin1|VRY %pin2|SW %pin3|value %value"
//% weight=100
//% blockGap=10
//% color="#808080"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=6
export function Rocker(pin1: AnalogPin, pin2: AnalogPin, pin3: DigitalPin, value: enRocker): boolean {
pins.setPull(pin3, PinPullMode.PullUp);
let x = pins.analogReadPin(pin1);
let y = pins.analogReadPin(pin2);
let z = pins.digitalReadPin(pin3);
let now_state = enRocker.Nostate;
if (x < 100) // 上
{
now_state = enRocker.Up;
}
else if (x > 700) //
{
now_state = enRocker.Down;
}
else // 左右
{
if (y < 100) //右
{
now_state = enRocker.Right;
}
else if (y > 700) //左
{
now_state = enRocker.Left;
}
}
if (z == 0)
now_state = enRocker.Press;
if (now_state == value)
return true;
else
return false;
}
//% blockId=mbit_Button block="Button|pin %pin|value %value"
//% weight=100
//% blockGap=10
//% color="#808080"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=5
export function Button(pin: DigitalPin, value: enButton): boolean {
pins.setPull(pin, PinPullMode.PullUp);
if (pins.digitalReadPin(pin) == value) {
return true;
}
else {
return false;
}
}
}
/*****************************************************************************************************************************************
* 音乐类 *****************************************************************************************************************************
****************************************************************************************************************************************/
//% color="#D2691E" weight=22 icon="\uf001"
namespace mbit_Music {
export enum enBuzzer {
//% blockId="NoBeep" block="silence"
NoBeep = 0,
//% blockId="Beep" block="sound"
Beep
}
//% blockId=mbit_Buzzer block="Buzzer|pin %pin|value %value"
//% weight=100
//% blockGap=10
//% color="#D2691E"
//% value.min=0 value.max=1
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=8
export function Buzzer(pin: DigitalPin, value: enBuzzer): void {
pins.setPull(pin, PinPullMode.PullNone);
pins.digitalWritePin(pin, value);
}
}
/*****************************************************************************************************************************************
* 电机类 *****************************************************************************************************************************
****************************************************************************************************************************************/
//% color="#0000CD" weight=21 icon="\uf185"
namespace mbit_Motor {
//% blockId=mbit_Fan block="Fan|pin %pin|speed %value"
//% weight=100
//% blockGap=10
//% color="#0000CD"
//% value.min=0 value.max=1023
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=9
export function Fan(pin: AnalogPin, value: number): void {
pins.analogWritePin(pin, value);
}
//% blockId=mbit_Servo block="Servo|pin %pin|value %value"
//% weight=100
//% blockGap=10
//% color="#0000CD"
//% value.min=0 value.max=180
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=9
export function Servo(pin: AnalogPin, value: number): void {
pins.servoWritePin(pin, value);
}
}
//% color="#006400" weight=20 icon="\uf1b9"
namespace mbit_Robot {
const PCA9685_ADD = 0x41
const MODE1 = 0x00
const MODE2 = 0x01
const SUBADR1 = 0x02
const SUBADR2 = 0x03
const SUBADR3 = 0x04
const LED0_ON_L = 0x06
const LED0_ON_H = 0x07
const LED0_OFF_L = 0x08
const LED0_OFF_H = 0x09
const ALL_LED_ON_L = 0xFA
const ALL_LED_ON_H = 0xFB
const ALL_LED_OFF_L = 0xFC
const ALL_LED_OFF_H = 0xFD
const PRESCALE = 0xFE
let initialized = false
let yahStrip: neopixel.Strip;
export enum enColor {
//% blockId="OFF" block="off"
OFF = 0,
//% blockId="Red" block="red"
Red,
//% blockId="Green" block="green"
Green,
//% blockId="Blue" block="blue"
Blue,
//% blockId="White" block="white"
White,
//% blockId="Cyan" block="cyan"
Cyan,
//% blockId="Pinkish" block="magenta"
Pinkish,
//% blockId="Yellow" block="yellow"
Yellow,
}
export enum enMusic {
dadadum = 0,
entertainer,
prelude,
ode,
nyan,
ringtone,
funk,
blues,
birthday,
wedding,
funereal,
punchline,
baddy,
chase,
ba_ding,
wawawawaa,
jump_up,
jump_down,
power_up,
power_down
}
export enum enPos {
//% blockId="LeftState" block="left state"
LeftState = 0,
//% blockId="RightState" block="right state"
RightState = 1
}
export enum enLineState {
//% blockId="White" block="white"
White = 0,
//% blockId="Black" block="black"
Black = 1
}
export enum enAvoidState {
//% blockId="OBSTACLE" block="with obstacles"
OBSTACLE = 0,
//% blockId="NOOBSTACLE" block="without obstacles"
NOOBSTACLE = 1
}
export enum enServo {
S1 = 1,
S2,
S3
}
export enum CarState {
//% blockId="Car_Run" block="forward"
Car_Run = 1,
//% blockId="Car_Back" block="back"
Car_Back = 2,
//% blockId="Car_Left" block="turn left"
Car_Left = 3,
//% blockId="Car_Right" block="turn right"
Car_Right = 4,
//% blockId="Car_Stop" block="stop"
Car_Stop = 5,
//% blockId="Car_SpinLeft" block="rotate left"
Car_SpinLeft = 6,
//% blockId="Car_SpinRight" block="rotate right"
Car_SpinRight = 7
}
function i2cwrite(addr: number, reg: number, value: number) {
let buf = pins.createBuffer(2)
buf[0] = reg
buf[1] = value
pins.i2cWriteBuffer(addr, buf)
}
function i2ccmd(addr: number, value: number) {
let buf = pins.createBuffer(1)
buf[0] = value
pins.i2cWriteBuffer(addr, buf)
}
function i2cread(addr: number, reg: number) {
pins.i2cWriteNumber(addr, reg, NumberFormat.UInt8BE);
let val = pins.i2cReadNumber(addr, NumberFormat.UInt8BE);
return val;
}
function initPCA9685(): void {
i2cwrite(PCA9685_ADD, MODE1, 0x00)
setFreq(50);
initialized = true
}
function setFreq(freq: number): void {
// Constrain the frequency
let prescaleval = 25000000;
prescaleval /= 4096;
prescaleval /= freq;
prescaleval -= 1;
let prescale = prescaleval; //Math.Floor(prescaleval + 0.5);
let oldmode = i2cread(PCA9685_ADD, MODE1);
let newmode = (oldmode & 0x7F) | 0x10; // sleep
i2cwrite(PCA9685_ADD, MODE1, newmode); // go to sleep
i2cwrite(PCA9685_ADD, PRESCALE, prescale); // set the prescaler
i2cwrite(PCA9685_ADD, MODE1, oldmode);
control.waitMicros(5000);
i2cwrite(PCA9685_ADD, MODE1, oldmode | 0xa1);
}
function setPwm(channel: number, on: number, off: number): void {
if (channel < 0 || channel > 15)
return;
if (!initialized) {
initPCA9685();
}
let buf = pins.createBuffer(5);
buf[0] = LED0_ON_L + 4 * channel;
buf[1] = on & 0xff;
buf[2] = (on >> 8) & 0xff;
buf[3] = off & 0xff;
buf[4] = (off >> 8) & 0xff;
pins.i2cWriteBuffer(PCA9685_ADD, buf);
}
function Car_run(speed1: number, speed2: number) {
speed1 = speed1 * 16; // map 350 to 4096
speed2 = speed2 * 16;
if (speed1 >= 4096) {
speed1 = 4095
}
if (speed1 <= 350) {
speed1 = 350
}
if (speed2 >= 4096) {
speed2 = 4095
}
if (speed2 <= 350) {
speed2 = 350
}
setPwm(12, 0, speed1);
setPwm(13, 0, 0);
setPwm(15, 0, speed2);
setPwm(14, 0, 0);
//pins.digitalWritePin(DigitalPin.P16, 1);
// pins.analogWritePin(AnalogPin.P1, 1023-speed); //速度控制
// pins.analogWritePin(AnalogPin.P0, speed);//速度控制
// pins.digitalWritePin(DigitalPin.P8, 0);
}
function Car_back(speed1: number, speed2: number) {
speed1 = speed1 * 16; // map 350 to 4096
speed2 = speed2 * 16;
if (speed1 >= 4096) {
speed1 = 4095
}
if (speed1 <= 350) {
speed1 = 350
}
if (speed2 >= 4096) {
speed2 = 4095
}
if (speed2 <= 350) {
speed2 = 350
}
setPwm(12, 0, 0);
setPwm(13, 0, speed1);
setPwm(15, 0, 0);
setPwm(14, 0, speed2);
//pins.digitalWritePin(DigitalPin.P16, 0);
//pins.analogWritePin(AnalogPin.P1, speed); //速度控制
//pins.analogWritePin(AnalogPin.P0, 1023 - speed);//速度控制
//pins.digitalWritePin(DigitalPin.P8, 1);
}
function Car_left(speed1: number, speed2: number) {
speed1 = speed1 * 16; // map 350 to 4096
speed2 = speed2 * 16;
if (speed1 >= 4096) {
speed1 = 4095
}
if (speed1 <= 350) {
speed1 = 350
}
if (speed2 >= 4096) {
speed2 = 4095
}
if (speed2 <= 350) {
speed2 = 350
}
setPwm(12, 0, speed1);
setPwm(13, 0, 0);
setPwm(15, 0, speed2);
setPwm(14, 0, 0);
//pins.analogWritePin(AnalogPin.P0, speed);
//pins.digitalWritePin(DigitalPin.P8, 0);
//pins.digitalWritePin(DigitalPin.P16, 0);
//pins.digitalWritePin(DigitalPin.P1, 0);
}
function Car_right(speed1: number, speed2: number) {
speed1 = speed1 * 16; // map 350 to 4096
speed2 = speed2 * 16;
if (speed1 >= 4096) {
speed1 = 4095
}
if (speed1 <= 350) {
speed1 = 350
}
if (speed2 >= 4096) {
speed2 = 4095
}
if (speed2 <= 350) {
speed2 = 350
}
setPwm(12, 0, speed1);
setPwm(13, 0, 0);
setPwm(15, 0, speed2);
setPwm(14, 0, 0);
//pins.digitalWritePin(DigitalPin.P0, 0);
//pins.digitalWritePin(DigitalPin.P8, 0);
//pins.digitalWritePin(DigitalPin.P16, 1);
// pins.analogWritePin(AnalogPin.P1, 1023 - speed);
}
function Car_stop() {
setPwm(12, 0, 0);
setPwm(13, 0, 0);
setPwm(15, 0, 0);
setPwm(14, 0, 0);
//pins.digitalWritePin(DigitalPin.P0, 0);
//pins.digitalWritePin(DigitalPin.P8, 0);
//pins.digitalWritePin(DigitalPin.P16, 0);
//pins.digitalWritePin(DigitalPin.P1, 0);
}
function Car_spinleft(speed1: number, speed2: number) {
speed1 = speed1 * 16; // map 350 to 4096
speed2 = speed2 * 16;
if (speed1 >= 4096) {
speed1 = 4095
}
if (speed1 <= 350) {
speed1 = 350
}
if (speed2 >= 4096) {
speed2 = 4095
}
if (speed2 <= 350) {
speed2 = 350
}
setPwm(12, 0, 0);
setPwm(13, 0, speed1);
setPwm(15, 0, speed2);
setPwm(14, 0, 0);
//pins.analogWritePin(AnalogPin.P0, speed);
//pins.digitalWritePin(DigitalPin.P8, 0);
//pins.digitalWritePin(DigitalPin.P16, 0);
//pins.analogWritePin(AnalogPin.P1, speed);
}
function Car_spinright(speed1: number, speed2: number) {
speed1 = speed1 * 16; // map 350 to 4096
speed2 = speed2 * 16;
if (speed1 >= 4096) {
speed1 = 4095
}
if (speed1 <= 350) {
speed1 = 350
}
if (speed2 >= 4096) {
speed2 = 4095
}
if (speed2 <= 350) {
speed2 = 350
}
setPwm(12, 0, speed1);
setPwm(13, 0, 0);
setPwm(15, 0, 0);
setPwm(14, 0, speed2);
//pins.analogWritePin(AnalogPin.P0, 1023-speed);
//pins.digitalWritePin(DigitalPin.P8, 1);
//pins.digitalWritePin(DigitalPin.P16, 1);
//pins.analogWritePin(AnalogPin.P1, 1023-speed);
}
/**
* *****************************************************************
* @param index
*/
//% blockId=mbit_RGB_Car_Big2 block="RGB_Car_Big2|value %value"
//% weight=101
//% blockGap=10
//% color="#C814B8"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
export function RGB_Car_Big2(value: enColor): void {
switch (value) {
case enColor.OFF: {
setPwm(0, 0, 0);
setPwm(1, 0, 0);
setPwm(2, 0, 0);
break;
}
case enColor.Red: {
setPwm(0, 0, 4095);
setPwm(1, 0, 0);
setPwm(2, 0, 0);
break;
}
case enColor.Green: {
setPwm(0, 0, 0);
setPwm(1, 0, 4095);
setPwm(2, 0, 0);
break;
}
case enColor.Blue: {
setPwm(0, 0, 0);
setPwm(1, 0, 0);
setPwm(2, 0, 4095);
break;
}
case enColor.White: {
setPwm(0, 0, 4095);
setPwm(1, 0, 4095);
setPwm(2, 0, 4095);
break;
}
case enColor.Cyan: {
setPwm(0, 0, 0);
setPwm(1, 0, 4095);
setPwm(2, 0, 4095);
break;
}
case enColor.Pinkish: {
setPwm(0, 0, 4095);
setPwm(1, 0, 0);
setPwm(2, 0, 4095);
break;
}
case enColor.Yellow: {
setPwm(0, 0, 4095);
setPwm(1, 0, 4095);
setPwm(2, 0, 0);
break;
}
}
}
//% blockId=mbit_RGB_Car_Big block="RGB_Car_Big|value1 %value1|value2 %value2|value3 %value3"
//% weight=100
//% blockGap=10
//% color="#C814B8"
//% value1.min=0 value1.max=255 value2.min=0 value2.max=255 value3.min=0 value3.max=255
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
export function RGB_Car_Big(value1: number, value2: number, value3: number): void {
let R = value1 * 16;
let G = value2 * 16;
let B = value3 * 16;
if (R > 4096)
R = 4095;
if (G > 4096)
G = 4095;
if (B > 4096)
B = 4095;
setPwm(0, 0, R);
setPwm(1, 0, G);
setPwm(2, 0, B);
}
//% blockId=mbit_RGB_Car_Program block="RGB_Car_Program"
//% weight=99
//% blockGap=10
//% color="#C814B8"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
export function RGB_Car_Program(): neopixel.Strip {
if (!yahStrip) {
yahStrip = neopixel.create(DigitalPin.P16, 3, NeoPixelMode.RGB);
}
return yahStrip;
}
//% blockId=mbit_ultrasonic_car block="ultrasonic return distance(cm)"
//% color="#006400"
//% weight=98
//% blockGap=10
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
export function Ultrasonic_Car(): number {
// send pulse
pins.setPull(DigitalPin.P14, PinPullMode.PullNone);
pins.digitalWritePin(DigitalPin.P14, 0);
control.waitMicros(2);
pins.digitalWritePin(DigitalPin.P14, 1);
control.waitMicros(15);
pins.digitalWritePin(DigitalPin.P14, 0);
// read pulse
let d = pins.pulseIn(DigitalPin.P15, PulseValue.High, 43200);
return d / 58;
}
//% blockId=mbit_Music_Car block="Music_Car|%index"
//% weight=97
//% blockGap=10
//% color="#006400"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
export function Music_Car(index: enMusic): void {
switch (index) {
case enMusic.dadadum: music.beginMelody(music.builtInMelody(Melodies.Dadadadum), MelodyOptions.Once); break;
case enMusic.birthday: music.beginMelody(music.builtInMelody(Melodies.Birthday), MelodyOptions.Once); break;
case enMusic.entertainer: music.beginMelody(music.builtInMelody(Melodies.Entertainer), MelodyOptions.Once); break;
case enMusic.prelude: music.beginMelody(music.builtInMelody(Melodies.Prelude), MelodyOptions.Once); break;
case enMusic.ode: music.beginMelody(music.builtInMelody(Melodies.Ode), MelodyOptions.Once); break;
case enMusic.nyan: music.beginMelody(music.builtInMelody(Melodies.Nyan), MelodyOptions.Once); break;
case enMusic.ringtone: music.beginMelody(music.builtInMelody(Melodies.Ringtone), MelodyOptions.Once); break;
case enMusic.funk: music.beginMelody(music.builtInMelody(Melodies.Funk), MelodyOptions.Once); break;
case enMusic.blues: music.beginMelody(music.builtInMelody(Melodies.Blues), MelodyOptions.Once); break;
case enMusic.wedding: music.beginMelody(music.builtInMelody(Melodies.Wedding), MelodyOptions.Once); break;
case enMusic.funereal: music.beginMelody(music.builtInMelody(Melodies.Funeral), MelodyOptions.Once); break;
case enMusic.punchline: music.beginMelody(music.builtInMelody(Melodies.Punchline), MelodyOptions.Once); break;
case enMusic.baddy: music.beginMelody(music.builtInMelody(Melodies.Baddy), MelodyOptions.Once); break;
case enMusic.chase: music.beginMelody(music.builtInMelody(Melodies.Chase), MelodyOptions.Once); break;
case enMusic.ba_ding: music.beginMelody(music.builtInMelody(Melodies.BaDing), MelodyOptions.Once); break;
case enMusic.wawawawaa: music.beginMelody(music.builtInMelody(Melodies.Wawawawaa), MelodyOptions.Once); break;
case enMusic.jump_up: music.beginMelody(music.builtInMelody(Melodies.JumpUp), MelodyOptions.Once); break;
case enMusic.jump_down: music.beginMelody(music.builtInMelody(Melodies.JumpDown), MelodyOptions.Once); break;
case enMusic.power_up: music.beginMelody(music.builtInMelody(Melodies.PowerUp), MelodyOptions.Once); break;
case enMusic.power_down: music.beginMelody(music.builtInMelody(Melodies.PowerDown), MelodyOptions.Once); break;
}
}
//% blockId=mbit_Servo_Car block="Servo_Car|num %num|value %value"
//% weight=96
//% blockGap=10
//% color="#006400"
//% num.min=1 num.max=3 value.min=0 value.max=180
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=9
export function Servo_Car(num: enServo, value: number): void {
// 50hz: 20,000 us
let us = (value * 1800 / 180 + 600); // 0.6 ~ 2.4
let pwm = us * 4096 / 20000;
setPwm(num + 2, 0, pwm);
}
//% blockId=mbit_Avoid_Sensor block="Avoid_Sensor|value %value"
//% weight=95
//% blockGap=10
//% color="#006400"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=12
export function Avoid_Sensor(value: enAvoidState): boolean {
let temp: boolean = false;
pins.digitalWritePin(DigitalPin.P9, 0);
switch (value) {
case enAvoidState.OBSTACLE: {
if (pins.analogReadPin(AnalogPin.P3) < 800) {
temp = true;
setPwm(8, 0, 0);
}
else {
temp = false;
setPwm(8, 0, 4095);
}
break;
}
case enAvoidState.NOOBSTACLE: {
if (pins.analogReadPin(AnalogPin.P3) > 800) {
temp = true;
setPwm(8, 0, 4095);
}
else {
temp = false;
setPwm(8, 0, 0);
}
break;
}
}
pins.digitalWritePin(DigitalPin.P9, 1);
return temp;
}
//% blockId=mbit_Line_Sensor block="Line_Sensor|direct %direct|value %value"
//% weight=94
//% blockGap=10
//% color="#006400"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=12
export function Line_Sensor(direct: enPos, value: enLineState): boolean {
let temp: boolean = false;
switch (direct) {
case enPos.LeftState: {
if (pins.analogReadPin(AnalogPin.P2) < 500) {
if (value == enLineState.White) {
temp = true;
}
setPwm(7, 0, 4095);
}
else {
if (value == enLineState.Black) {
temp = true;
}
setPwm(7, 0, 0);
}
break;
}
case enPos.RightState: {
if (pins.analogReadPin(AnalogPin.P1) < 500) {
if (value == enLineState.White) {
temp = true;
}
setPwm(6, 0, 4095);
}
else {
if (value == enLineState.Black) {
temp = true;
}
setPwm(6, 0, 0);
}
break;
}
}
return temp;
}
//% blockId=mbit_CarCtrl block="CarCtrl|%index"
//% weight=93
//% blockGap=10
//% color="#006400"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=10
export function CarCtrl(index: CarState): void {
switch (index) {
case CarState.Car_Run: Car_run(255, 255); break;
case CarState.Car_Back: Car_back(255, 255); break;
case CarState.Car_Left: Car_left(255, 255); break;
case CarState.Car_Right: Car_right(255, 255); break;
case CarState.Car_Stop: Car_stop(); break;
case CarState.Car_SpinLeft: Car_spinleft(255, 255); break;
case CarState.Car_SpinRight: Car_spinright(255, 255); break;
}
}
//% blockId=mbit_CarCtrlSpeed block="CarCtrlSpeed|%index|speed %speed"
//% weight=92
//% blockGap=10
//% speed.min=0 speed.max=255
//% color="#006400"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=10
export function CarCtrlSpeed(index: CarState, speed: number): void {
switch (index) {
case CarState.Car_Run: Car_run(speed, speed); break;
case CarState.Car_Back: Car_back(speed, speed); break;
case CarState.Car_Left: Car_left(speed, speed); break;
case CarState.Car_Right: Car_right(speed, speed); break;
case CarState.Car_Stop: Car_stop(); break;
case CarState.Car_SpinLeft: Car_spinleft(speed, speed); break;
case CarState.Car_SpinRight: Car_spinright(speed, speed); break;
}
}
//% blockId=mbit_CarCtrlSpeed2 block="CarCtrlSpeed2|%index|speed1 %speed1|speed2 %speed2"
//% weight=91
//% blockGap=10
//% speed1.min=0 speed1.max=255 speed2.min=0 speed2.max=255
//% color="#006400"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=10
export function CarCtrlSpeed2(index: CarState, speed1: number, speed2: number): void {
switch (index) {
case CarState.Car_Run: Car_run(speed1, speed2); break;
case CarState.Car_Back: Car_back(speed1, speed2); break;
case CarState.Car_Left: Car_left(speed1, speed2); break;
case CarState.Car_Right: Car_right(speed1, speed2); break;
case CarState.Car_Stop: Car_stop(); break;
case CarState.Car_SpinLeft: Car_spinleft(speed1, speed2); break;
case CarState.Car_SpinRight: Car_spinright(speed1, speed2); break;
}
}
}