Lightmonster (#346)

* fixed boardname issues

* refactored servo info

* coffee cup monster lesson skeleton

* display event source id / value in advanced section

* normalized project structure

* updated project name

* Update projects.md
This commit is contained in:
Peli de Halleux 2017-01-31 08:29:25 -08:00 committed by GitHub
parent 595e4a23e6
commit 1d47b4de0d
29 changed files with 209 additions and 78 deletions

View File

@ -1,5 +1,5 @@
# microbit-chrome # microbit-chrome
Prototype chrome addon that exposes the micro:bit's serial output to webpages. Prototype chrome addon that exposes the @boardname@'s serial output to webpages.
* watch the [demo video](https://vimeo.com/146207766) * watch the [demo video](https://vimeo.com/146207766)
# Installation # Installation

View File

@ -1,13 +1,4 @@
# Preparing the servo # Equipping a microservo with Crocodile clips
### @description Connecting the servo to crocodile clips
### ~avatar avatar
Equip the microservo with crocodile clips.
### ~
## Duration: ~30 minutes
## Materials ## Materials
* Cutting pliers or wire cutter * Cutting pliers or wire cutter
@ -70,7 +61,7 @@ Place the cables next to each other
It is very **important** to ensure that there is a good connection between the 2 cables. It is very **important** to ensure that there is a good connection between the 2 cables.
If the connection is weak, the microservo will not receive enough current and it will not work. If the connection is weak, the microservo will not receive enough current and it will not work.
If you have access to a soldering iron, we strongly recommend to solver this connection. **If you have access to a soldering iron, we strongly recommend to solder this connection.**
### ~ ### ~
@ -105,11 +96,9 @@ When attaching the crocodile clips to the pins, don't hesitate to grab the side
* Download the following code to your @boardname@ * Download the following code to your @boardname@
```blocks ```blocks
let a = 0
basic.forever(() => { basic.forever(() => {
a = input.acceleration(Dimension.X)
pins.servoWritePin(AnalogPin.P0, pins.map( pins.servoWritePin(AnalogPin.P0, pins.map(
a, input.acceleration(Dimension.X),
-512, -512,
512, 512,
0, 0,
@ -121,10 +110,7 @@ basic.forever(() => {
* When powered by USB, make sure that the servo moves when you tilt the board. * When powered by USB, make sure that the servo moves when you tilt the board.
* When powered by batteries **only**, make sure that the servo moves when you tilt the board. * When powered by batteries **only**, make sure that the servo moves when you tilt the board.
## Troubleshooting
If your servo seems to sutter and stay stuck at a particular position, it means that it is not receiving enough power. If your servo seems to sutter and stay stuck at a particular position, it means that it is not receiving enough power.
This is probably due to a weak connection or low battery level. Check each connection and check your batteries. This is probably due to a weak connection or low battery level. Check each connection and check your batteries.
### ~button /projects/inchworm/chassis
NEXT: Chassis
### ~

View File

@ -62,17 +62,13 @@ Fun games to build with your @boardname@.
}] }]
``` ```
## Science and Engineering ## Toys
```codecard ```codecard
[{ [{
"name": "Inchworm", "name": "Inchworm",
"url":"/projects/inchworm", "url":"/projects/inchworm",
"imageUrl":"/static/mb/projects/inchworm.jpg" "imageUrl":"/static/mb/projects/inchworm.jpg"
}, {
"name": "Timing gates",
"url":"/projects/timing-gates",
"imageUrl":"/static/mb/projects/timing-gates.jpg"
}] }]
``` ```
@ -80,6 +76,10 @@ Fun games to build with your @boardname@.
```codecard ```codecard
[{ [{
"name": "Timing gates",
"url":"/projects/timing-gates",
"imageUrl":"/static/mb/projects/timing-gates.jpg"
}, {
"name": "Compass", "name": "Compass",
"url":"/projects/compass", "url":"/projects/compass",
"imageUrl":"/static/mb/projects/a5-compass.png" "imageUrl":"/static/mb/projects/a5-compass.png"

View File

@ -21,8 +21,8 @@ Build your own @boardname@ piano using bananas!
## Activities ## Activities
* [Making the keyboard](/projects/banana-keyboard/make) * [Make](/projects/banana-keyboard/make)
* [Beat box](/projects/banana-keyboard/beat-box) * [Code](/projects/banana-keyboard/code)
### ~button /projects/banana-keyboard/make ### ~button /projects/banana-keyboard/make
Let's get started! Let's get started!

View File

@ -1,4 +1,4 @@
# banana keyboard - beat box # Code
Have you ever tried to making beat box sounds? Let's try making a beatbox with code! Have you ever tried to making beat box sounds? Let's try making a beatbox with code!

View File

@ -1,4 +1,4 @@
# banana keyboard - making # Make
## Materials ## Materials
@ -80,6 +80,6 @@ input.onPinPressed(TouchPin.P1, () => {
Tap your banana instrument to play sound against... the fruit! Tap your banana instrument to play sound against... the fruit!
### ~button /projects/banana-keyboard/beat-box ### ~button /projects/banana-keyboard/code
NEXT: beat box NEXT: beat box
### ~ ### ~

View File

@ -0,0 +1,43 @@
# Coffee Cup Monster
### @description A monster made of cardboard that responds to light
### ~avatar avatar
Make a coffee cup monster that responds to light!
### ~
https://youtu.be/BiZLjugXMbM
## Duration
3 Activities, approx 30-45 min each based on familiarity with the coding concepts
## Materials
* 3 Coffee cup holders
* 2 Coffee cup strirer wood sticks
* Glue gun
* Scissors that can cut cardboard
* 1 @boardname@, battery holder and 2 AAA batteries
* 3 Crocodile clips
* 1 micro servo 9g SG90
* 1 paper clip
## Preparation
* [Equip the microservo with crocodile clips](/device/servo)
## Activities
* [Make](/projects/coffee-cup-monster/make)
* [Code](/projects/coffee-cup-monster/code)
* [Connect](/projects/coffee-cup-monster/connect)
### ~button /projects/coffee-cup-monster/make
Let's get started!
### ~

View File

@ -0,0 +1,29 @@
# Code
### @description code to make the coffee cup monster alive
### ~avatar avatar
Add code to open the mouth when light is detected.
### ~
## Duration: ~30 minutes
We are going to add code to open the mouth proportionally to the amount of light on the @boardname@.
In a loop, we will read the light and map it to an angle using the ``pins.map`` function.
```blocks
basic.forever(() => {
pins.servoWritePin(AnalogPin.P0, pins.map(
input.lightLevel(),
0,
255,
30,
150
))
})
```
### ~button /projects/coffee-cup-monster/connect
NEXT: Connect
### ~

View File

@ -0,0 +1,29 @@
# Connect
### ~avatar avatar
Remote control your monster with another @boardname@
### ~
## Duration: ~30 minutes
You will need 2 @boardname@ for this part. By using the radio, we can make the inchworm controlled by another @boardname@.
Download the code below to the @boardname@ on the inchworm and another "controller" @boardname@.
Whenere A is pressed, the monster will open and close it's mouth will move once.
```blocks
radio.onDataPacketReceived(({receivedNumber}) => {
pins.servoWritePin(AnalogPin.P0, 30)
basic.pause(500)
pins.servoWritePin(AnalogPin.P0, 150)
basic.pause(500)
})
input.onButtonPressed(Button.A, () => {
radio.sendNumber(0)
})
```
```package
radio
```

View File

@ -0,0 +1,25 @@
# Make
### @description Building the coffee cup monster
### ~avatar avatar
Turn a piece of coffee holders into a monster!
### ~
## Duration: ~60 minutes
## Materials
* 3 Coffee cup holders
* 2 Coffee cup strirer wood sticks
* Scissors
* glue gun or tape
* 1 paper clip
## Step 1: cardboard
TODO
### ~button /projects/coffee-cup-monster/code
NEXT: Code
### ~

View File

@ -27,8 +27,8 @@ Build your own music player @boardname@ from headphones.
## Activities ## Activities
* [Connect your headphone](/projects/hack-your-headphones/make) * [Make](/projects/hack-your-headphones/make)
* [Play sounds!]() * [Code](/projects/hack-your-headphones/code)
### ~button /projects/hack-your-headphones/make ### ~button /projects/hack-your-headphones/make

View File

@ -1,4 +1,4 @@
# hack your headphones - music of light # Code
### ~avatar avatar ### ~avatar avatar

View File

@ -1,4 +1,4 @@
# hack your headphones - making # Make
### ~avatar avatar ### ~avatar avatar
@ -46,7 +46,7 @@ Using the 2nd crocodile clip, connect the second end of the crocodile clip onto
You hacked your headphones! You hacked your headphones!
### ~button /projects/hack-your-headphones/music-of-light ### ~button /projects/hack-your-headphones/code
NEXT: music of light NEXT: music of light

View File

@ -1,7 +1,7 @@
# Inchworm # Inchworm
### @description A inchworm like robot built with the micro:bit ### @description A inchworm like robot built with the @boardname@
### ~avatar avatar ### ~avatar avatar
@ -27,13 +27,17 @@ https://youtu.be/BiZLjugXMbM
![Materials](/static/mb/projects/inchworm/materials.jpg) ![Materials](/static/mb/projects/inchworm/materials.jpg)
## Preparation
* [Equip the microservo with crocodile clips](/device/servo)
## Activities ## Activities
* [Servo](/projects/inchworm/servo) * [Make](/projects/inchworm/make)
* [Chassis](/projects/inchworm/chassis)
* [Code](/projects/inchworm/code) * [Code](/projects/inchworm/code)
* [Connect](/projects/inchworm/connect)
### ~button /projects/inchworm/servo ### ~button /projects/inchworm/make
Let's get started! Let's get started!

View File

@ -30,23 +30,6 @@ so that the inchworm goes as fast as possible. Trying it on carpet also great he
### ~ ### ~
## Step 2: radio controlled inchworm ### ~button /projects/inchworm/connect
NEXT: Connect
You will need 2 @boardname@ for this part. By using the radio, we can make the inchworm controlled by another @boardname@. ### ~
Download the code below to the @boardname@ on the inchworm and another "controller" @boardname@. Whenere A is pressed, the inchworm will move once.
```blocks
radio.onDataPacketReceived(({receivedNumber}) => {
pins.servoWritePin(AnalogPin.P0, 0)
basic.pause(500)
pins.servoWritePin(AnalogPin.P0, 180)
basic.pause(500)
})
input.onButtonPressed(Button.A, () => {
radio.sendNumber(0)
})
```
```package
radio
```

View File

@ -0,0 +1,28 @@
# Connect
### ~avatar avatar
Remote control your inchworm with another @boardname@
### ~
## Duration: ~30 minutes
You will need 2 @boardname@ for this part. By using the radio, we can make the inchworm controlled by another @boardname@.
Download the code below to the @boardname@ on the inchworm and another "controller" @boardname@. Whenere A is pressed, the inchworm will move once.
```blocks
radio.onDataPacketReceived(({receivedNumber}) => {
pins.servoWritePin(AnalogPin.P0, 0)
basic.pause(500)
pins.servoWritePin(AnalogPin.P0, 180)
basic.pause(500)
})
input.onButtonPressed(Button.A, () => {
radio.sendNumber(0)
})
```
```package
radio
```

View File

@ -1,4 +1,4 @@
# Chassis # Make
### @description Building the cardboard inchworm ### @description Building the cardboard inchworm
### ~avatar avatar ### ~avatar avatar

View File

@ -17,8 +17,8 @@ Build a telegraph between two @boardname@s to communicate with your friends!
## Activities ## Activities
* [Making the circuit](/projects/telegraph/make) * [Make](/projects/telegraph/make)
* [Manual telegraph](/projects/telegraph/manual-telegraph) * [Code](/projects/telegraph/code)
### ~button /projects/telegraph/make ### ~button /projects/telegraph/make
Let's get started! Let's get started!

View File

@ -1,4 +1,4 @@
# telegraph - manual telegraph # Code
Let's build the code that will send a impulse while the user presses ``A``. Let's build the code that will send a impulse while the user presses ``A``.

View File

@ -1,4 +1,4 @@
# telegraph - making # Make
### ~avatar ### ~avatar
@ -68,8 +68,8 @@ Using the 4th crocodile clip, connect the unattached end of the crocodile clip o
![](/static/mb/lessons/telegraph-0.png) ![](/static/mb/lessons/telegraph-0.png)
### ~button /projects/telegraph/manual-telegraph ### ~button /projects/telegraph/code
NEXT: manual telegraph NEXT: Code
### ~ ### ~

View File

@ -1,4 +1,4 @@
# Wallet - Code # Code
## Simple animation ## Simple animation

View File

@ -1,4 +1,4 @@
# Wallet - Make # Make
### @description Maker Project for Wallet ### @description Maker Project for Wallet

View File

@ -25,7 +25,7 @@ bluetooth.advertiseUidBuffer(pins.createBuffer(16), 7, true);
* ``buffer`` - a 16 bytes buffer containing the namespace (first 10 bytes) and instance (last 6 bytes). * ``buffer`` - a 16 bytes buffer containing the namespace (first 10 bytes) and instance (last 6 bytes).
* ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range). * ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range).
* ``connectable`` - a [boolean](/blocks/logic/boolean) indicating whether or not the micro:bit should accept connections. * ``connectable`` - a [boolean](/blocks/logic/boolean) indicating whether or not the @boardname@ should accept connections.
## See Also ## See Also

View File

@ -26,7 +26,7 @@ bluetooth.advertiseUid(42, 1, 7, true);
* ``namespace`` last 4 bytes of the namespace uid (6 to 9) * ``namespace`` last 4 bytes of the namespace uid (6 to 9)
* ``instance`` last 4 bytes of the instance (2 to 5) * ``instance`` last 4 bytes of the instance (2 to 5)
* ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range). * ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range).
* ``connectable`` - a [boolean](/blocks/logic/boolean) indicating whether or not the micro:bit should accept connections. * ``connectable`` - a [boolean](/blocks/logic/boolean) indicating whether or not the @boardname@ should accept connections.
## Encoding ## Encoding

View File

@ -25,7 +25,7 @@ bluetooth.advertiseUrl("https://pxt.microbit.org/", 7, true);
* ``url`` - a [string](/reference/types/string) containing the URL to broadcast, at most 17 characters long, excluding the protocol (eg: ``https://``) which gets encoded as 1 byte. * ``url`` - a [string](/reference/types/string) containing the URL to broadcast, at most 17 characters long, excluding the protocol (eg: ``https://``) which gets encoded as 1 byte.
* ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range). * ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range).
* ``connectable`` - a [boolean](/blocks/logic/boolean) indicating whether or not the micro:bit should accept connections. * ``connectable`` - a [boolean](/blocks/logic/boolean) indicating whether or not the @boardname@ should accept connections.
### Example: Broadcast a secret code ### Example: Broadcast a secret code

View File

@ -193,6 +193,7 @@ namespace control {
* Gets a friendly name for the device derived from the its serial number * Gets a friendly name for the device derived from the its serial number
*/ */
//% blockId="control_device_name" block="device name" weight=10 blockGap=8 //% blockId="control_device_name" block="device name" weight=10 blockGap=8
//% advanced=true
StringData* deviceName() { StringData* deviceName() {
return ManagedString(microbit_friendly_name()).leakData(); return ManagedString(microbit_friendly_name()).leakData();
} }
@ -201,6 +202,7 @@ namespace control {
* Derive a unique, consistent serial number of this device from internal data. * Derive a unique, consistent serial number of this device from internal data.
*/ */
//% blockId="control_device_serial_number" block="device serial number" weight=9 //% blockId="control_device_serial_number" block="device serial number" weight=9
//% advanced=true
int deviceSerialNumber() { int deviceSerialNumber() {
return microbit_serial_number(); return microbit_serial_number();
} }

View File

@ -9,7 +9,7 @@ namespace control {
* Returns the value of a C++ runtime constant * Returns the value of a C++ runtime constant
*/ */
//% weight=2 weight=19 blockId="control_event_source_id" block="%id" blockGap=8 //% weight=2 weight=19 blockId="control_event_source_id" block="%id" blockGap=8
//% shim=TD_ID //% shim=TD_ID advanced=true
export function eventSourceId(id: EventBusSource): number { export function eventSourceId(id: EventBusSource): number {
return id; return id;
} }
@ -17,7 +17,7 @@ namespace control {
* Returns the value of a C++ runtime constant * Returns the value of a C++ runtime constant
*/ */
//% weight=1 weight=19 blockId="control_event_value_id" block="%id" //% weight=1 weight=19 blockId="control_event_value_id" block="%id"
//% shim=TD_ID //% shim=TD_ID advanced=true
export function eventValueId(id: EventBusValue): number { export function eventValueId(id: EventBusValue): number {
return id; return id;
} }

View File

@ -174,7 +174,7 @@ namespace music {
*/ */
//% weight=50 help=music/note-frequency //% weight=50 help=music/note-frequency
//% blockId=device_note block="%note" //% blockId=device_note block="%note"
//% shim=TD_ID //% shim=TD_ID blockHidden=true
export function noteFrequency(name: Note): number { export function noteFrequency(name: Note): number {
return name; return name;
} }

View File

@ -415,13 +415,15 @@ declare namespace control {
/** /**
* Gets a friendly name for the device derived from the its serial number * Gets a friendly name for the device derived from the its serial number
*/ */
//% blockId="control_device_name" block="device name" weight=10 blockGap=8 shim=control::deviceName //% blockId="control_device_name" block="device name" weight=10 blockGap=8
//% advanced=true shim=control::deviceName
function deviceName(): string; function deviceName(): string;
/** /**
* Derive a unique, consistent serial number of this device from internal data. * Derive a unique, consistent serial number of this device from internal data.
*/ */
//% blockId="control_device_serial_number" block="device serial number" weight=9 shim=control::deviceSerialNumber //% blockId="control_device_serial_number" block="device serial number" weight=9
//% advanced=true shim=control::deviceSerialNumber
function deviceSerialNumber(): number; function deviceSerialNumber(): number;
} }