/* 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(10); 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="cygn" 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(10); 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; } } }