commit 83e4c406f5ca631592d8d184539278e22ecc497e Author: lzty634158 <398310535@qq.com> Date: Mon Mar 26 10:07:21 2018 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6c0108 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +built +node_modules +yotta_modules +yotta_targets +pxt_modules +*.db +*.tgz diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e431228 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,19 @@ +{ + "editor.formatOnType": true, + "files.autoSave": "afterDelay", + "files.watcherExclude": { + "**/.git/objects/**": true, + "**/built/**": true, + "**/node_modules/**": true, + "**/yotta_modules/**": true, + "**/yotta_targets": true, + "**/pxt_modules/**": true + }, + "search.exclude": { + "**/built": true, + "**/node_modules": true, + "**/yotta_modules": true, + "**/yotta_targets": true, + "**/pxt_modules": true + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..441d7d1 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,36 @@ + +// A task runner that calls the PXT compiler and +{ + "version": "0.1.0", + + // The command is pxt. Assumes that PXT has been installed using npm install -g pxt + "command": "pxt", + + // The command is a shell script + "isShellCommand": true, + + // Show the output window always. + "showOutput": "always", + + "tasks": [{ + "taskName": "deploy", + "isBuildCommand": true, + "problemMatcher": "$tsc", + "args": [""] + }, { + "taskName": "build", + "isTestCommand": true, + "problemMatcher": "$tsc", + "args": [""] + }, { + "taskName": "clean", + "isTestCommand": true, + "problemMatcher": "$tsc", + "args": [""] + }, { + "taskName": "serial", + "isTestCommand": true, + "problemMatcher": "$tsc", + "args": [""] + }] +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..03bfe0a --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2017 Riven + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9068464 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +all: deploy + +build: + pxt build + +deploy: + pxt deploy + +test: + pxt test diff --git a/README.md b/README.md new file mode 100644 index 0000000..da3e8dc --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# mbit + +Extension for Yahboom mbit + +## License + +MIT + +## Supported targets + +* for PXT/microbit +(The metadata above is needed for package search.) diff --git a/_locales/zh/mbit-strings.json b/_locales/zh/mbit-strings.json new file mode 100644 index 0000000..dc61f16 --- /dev/null +++ b/_locales/zh/mbit-strings.json @@ -0,0 +1,33 @@ +{ + + "mbit_显示类.LED1|block": "LED灯|引脚 %pin|状态 %value", + "mbit_显示类.LED2|block": "LED灯|引脚 %pin|亮度 %value", + "mbit_显示类.BreathLED|block": "呼吸灯|引脚 %pin", + "mbit_显示类.RGB|block": "RGB七彩灯|引脚R %pin1|引脚G %pin2|引脚B %pin3|红色 %value1|绿色 %value2|蓝色 %value3", + "mbit_显示类.RGB2|block": "RGB七彩灯|引脚R %pin1|引脚G %pin2|引脚B %pin3|显示 %value", + + "mbit_输入类.TouchPad|block": "触摸开关|引脚 %pin|返回 %value", + "mbit_输入类.Rocker|block": "遥杆|VRX %pin1|VRY %pin2|SW %pin3|返回 %value", + "mbit_输入类.Button|block": "按键|引脚 %pin|返回 %value", + + "mbit_传感器类.Voice_Sensor|block": "声音传感器|引脚 %pin|返回 %value", + "mbit_传感器类.IR_Sensor|block": "红外传感器|引脚 %pin| |%value|障碍物", + "mbit_传感器类.IR_Send|block": "红外发射|引脚 %pin", + "mbit_传感器类.Ultrasonic|block": "超声波|发射管脚 %Trig|接收管脚 %Echo", + + "mbit_音乐类.Buzzer|block": "有源蜂鸣器|引脚 %pin|值 %value", + + "mbit_电机类.Fan|block": "风扇|引脚 %pin|速度 %value", + "mbit_电机类.Servo|block": "舵机|引脚 %pin|角度 %value", + + "mbit_小车类.RGB_Car_Big|block": "小车RGB探照灯|红色 %value1|绿色 %value2|蓝色 %value3", + "mbit_小车类.RGB_Car_Big2|block": "小车RGB探照灯|选择车灯颜色 %value", + "mbit_小车类.Ultrasonic_Car|block": "超声波返回(cm)", + "mbit_小车类.RGB_Car_Program|block": "七彩流水灯", + "mbit_小车类.Music_Car|block": "小车音乐播放|%index", + "mbit_小车类.Line_Sensor|block": "巡线传感器|位置 %direct|检测到 %value", + "mbit_小车类.Avoid_Sensor|block": "避障传感器|检测到 %value", + "mbit_小车类.Servo_Car|block": "小车舵机|编号 %num|角度 %value", + "mbit_小车类.CarCtrl|block": "小车控制|%index", + "mbit_小车类.CarCtrlSpeed|block": "小车控制|%index|速度 %speed" +} diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..96d4726 Binary files /dev/null and b/icon.png differ diff --git a/main.ts b/main.ts new file mode 100644 index 0000000..f5e73a2 --- /dev/null +++ b/main.ts @@ -0,0 +1,1034 @@ +/* +R +modified from liusen +load dependency +"mbit": "file:../pxt-mbit" +*/ + + + +//% color="#C814B8" weight=25 icon="\uf1d4" +namespace mbit_显示类 { + + export enum enColor { + + //% blockId="OFF" block="灭" + OFF = 0, + //% blockId="Red" block="红色" + Red, + //% blockId="Green" block="绿色" + Green, + //% blockId="Blue" block="蓝色" + Blue, + //% blockId="White" block="白色" + White, + //% blockId="Cyan" block="青色" + Cyan, + //% blockId="Pinkish" block="品红" + Pinkish, + //% blockId="Green" block="黄色" + Yellow, + + } + export enum enLED1 { + + //% blockId="OFF" block="灭" + OFF = 0, + //% blockId="ON" block="亮" + 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_传感器类 { + + export enum enVoice { + //% blockId="Voice" block="有声音" + Voice = 0, + //% blockId="NoVoice" block="无声音" + NoVoice = 1 + } + + export enum enIR { + //% blockId="Get" block="检测到" + Get = 0, + //% blockId="NoVoice" block="未检测" + 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|障碍物" + //% 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; + } +} + +/***************************************************************************************************************************************** + * 输入类 ***************************************************************************************************************************** + ****************************************************************************************************************************************/ + +//% color="#808080" weight=23 icon="\uf11c" +namespace mbit_输入类 { + + export enum enRocker { + //% blockId="Nostate" block="无" + Nostate = 0, + //% blockId="Up" block="上" + Up, + //% blockId="Down" block="下" + Down, + //% blockId="Left" block="左" + Left, + //% blockId="Right" block="右" + Right, + //% blockId="Press" block="按下" + Press + } + + export enum enTouch { + //% blockId="NoTouch" block="未触摸" + NoTouch = 0, + //% blockId="Touch" block="触摸" + Touch = 1 + } + export enum enButton { + //% blockId="Press" block="按下" + Press = 0, + //% blockId="Realse" block="松开" + 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_音乐类 { + export enum enBuzzer { + + //% blockId="NoBeep" block="不响" + NoBeep = 0, + //% blockId="Beep" block="响" + 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_电机类 { + + //% 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_小车类 { + + 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 = 0, + //% blockId="Red" block="红色" + Red, + //% blockId="Green" block="绿色" + Green, + //% blockId="Blue" block="蓝色" + Blue, + //% blockId="White" block="白色" + White, + //% blockId="Cyan" block="青色" + Cyan, + //% blockId="Pinkish" block="品红" + Pinkish, + //% blockId="Green" block="黄色" + 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="左边状态" + LeftState = 0, + //% blockId="RightState" block="右边状态" + RightState = 1 + } + + export enum enLineState { + //% blockId="White" block="白线" + White = 0, + //% blockId="Black" block="黑线" + Black = 1 + + } + + export enum enAvoidState { + //% blockId="OBSTACLE" block="有障碍物" + OBSTACLE = 0, + //% blockId="NOOBSTACLE" block="无障碍物" + NOOBSTACLE = 1 + + } + + + export enum enServo { + + S1 = 1, + S2, + S3 + } + export enum CarState { + //% blockId="Car_Run" block="前行" + Car_Run = 1, + //% blockId="Car_Back" block="后退" + Car_Back = 2, + //% blockId="Car_Left" block="左转" + Car_Left = 3, + //% blockId="Car_Right" block="右转" + Car_Right = 4, + //% blockId="Car_Stop" block="停止" + Car_Stop = 5, + //% blockId="Car_SpinLeft" block="原地左旋" + Car_SpinLeft = 6, + //% blockId="Car_SpinRight" block="原地右旋" + 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(speed: number) { + + speed = speed * 16; // map 350 to 4096 + if (speed >= 4096) { + speed = 4095 + } + if (speed <= 350) { + speed = 350 + } + + setPwm(12, 0, speed); + setPwm(13, 0, 0); + + setPwm(15, 0, speed); + 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(speed: number) { + + speed = speed * 16; // map 350 to 4096 + if (speed >= 4096) { + speed = 4095 + } + if (speed <= 350 && speed != 0) { + speed = 350 + } + + setPwm(12, 0, 0); + setPwm(13, 0, speed); + + setPwm(15, 0, 0); + setPwm(14, 0, speed); + + //pins.digitalWritePin(DigitalPin.P16, 0); + //pins.analogWritePin(AnalogPin.P1, speed); //速度控制 + + //pins.analogWritePin(AnalogPin.P0, 1023 - speed);//速度控制 + //pins.digitalWritePin(DigitalPin.P8, 1); + } + + function Car_left(speed: number) { + + speed = speed * 16; // map 350 to 4096 + if (speed >= 4096) { + speed = 4095 + } + if (speed <= 350 && speed != 0) { + speed = 350 + } + setPwm(12, 0, 0); + setPwm(13, 0, 0); + + setPwm(15, 0, speed); + 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(speed: number) { + + speed = speed * 16; // map 350 to 4096 + if (speed >= 4096) { + speed = 4095 + } + if (speed <= 350 && speed != 0) { + speed = 350 + } + setPwm(12, 0, speed); + 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, 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(speed: number) { + + speed = speed * 16; // map 350 to 4096 + if (speed >= 4096) { + speed = 4095 + } + if (speed <= 350 && speed != 0) { + speed = 350 + } + setPwm(12, 0, 0); + setPwm(13, 0, speed); + + setPwm(15, 0, speed); + 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(speed: number) { + + speed = speed * 16; // map 350 to 4096 + if (speed >= 4096) { + speed = 4095 + } + if (speed <= 350 && speed != 0) { + speed = 350 + } + setPwm(12, 0, speed); + setPwm(13, 0, 0); + + setPwm(15, 0, 0); + setPwm(14, 0, speed); + //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); break; + case CarState.Car_Back: Car_back(255); break; + case CarState.Car_Left: Car_left(255); break; + case CarState.Car_Right: Car_right(255); break; + case CarState.Car_Stop: Car_stop(); break; + case CarState.Car_SpinLeft: Car_spinleft(255); break; + case CarState.Car_SpinRight: Car_spinright(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); break; + case CarState.Car_Back: Car_back(speed); break; + case CarState.Car_Left: Car_left(speed); break; + case CarState.Car_Right: Car_right(speed); break; + case CarState.Car_Stop: Car_stop(); break; + case CarState.Car_SpinLeft: Car_spinleft(speed); break; + case CarState.Car_SpinRight: Car_spinright(speed); break; + } + } +} diff --git a/pxt.json b/pxt.json new file mode 100644 index 0000000..a4870a3 --- /dev/null +++ b/pxt.json @@ -0,0 +1,23 @@ +{ + "name": "mbit", + "version": "1.1.0", + "description": "Extension for YahBoom m:bit", + "license": "MIT", + "dependencies": { + "core": "*", + "neopixel": "github:microsoft/pxt-neopixel#v0.3.10", + "Mbit_IR": "github:lzty634158/yahboom_mbit_IR" + + + }, + "files": [ + "README.md", + "main.ts", + "_locales/zh/mbit-strings.json" + + ], + "testFiles": [ + "test.ts" + ], + "public": true +} \ No newline at end of file diff --git a/pxt.json.bak b/pxt.json.bak new file mode 100644 index 0000000..b210eca --- /dev/null +++ b/pxt.json.bak @@ -0,0 +1,23 @@ +{ + "name": "mbit", + "version": "1.1.0", + "description": "Extension for YahBoom m:bit", + "license": "MIT", + "dependencies": { + "core": "*", + "neopixel": "github:microsoft/pxt-neopixel#v0.3.10", + "Mbit_IR": "github:lzty634158/yahboom_mbit_IR#v1.0.0" + + + }, + "files": [ + "README.md", + "main.ts", + "_locales/zh/mbit-strings.json" + + ], + "testFiles": [ + "test.ts" + ], + "public": true +} \ No newline at end of file diff --git a/test.ts b/test.ts new file mode 100644 index 0000000..34fc63d --- /dev/null +++ b/test.ts @@ -0,0 +1 @@ +// tests go here; this will not be compiled when this package is used as a library diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..a2079ff --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "es5", + "noImplicitAny": true, + "outDir": "built", + "rootDir": "." + }, + "exclude": ["pxt_modules/**/*test.ts"] +}