├── .gitignore ├── web ├── mainInfo.js ├── images │ ├── Control │ │ ├── left.png │ │ ├── right.png │ │ ├── control.png │ │ ├── forward.png │ │ ├── left@2x.png │ │ ├── left@3x.png │ │ ├── backward.png │ │ ├── control@2x.png │ │ ├── control@3x.png │ │ ├── controls.png │ │ ├── forward@2x.png │ │ ├── forward@3x.png │ │ ├── right@2x.png │ │ ├── right@3x.png │ │ ├── backward@2x.png │ │ ├── backward@3x.png │ │ ├── controls@2x.png │ │ └── controls@3x.png │ └── Buttons │ │ ├── Help │ │ ├── help.png │ │ ├── help@2x.png │ │ └── help@3x.png │ │ ├── Speed │ │ ├── fast.png │ │ ├── slow.png │ │ ├── medium.png │ │ ├── fast@2x.png │ │ ├── fast@3x.png │ │ ├── medium@2x.png │ │ ├── medium@3x.png │ │ ├── slow@2x.png │ │ └── slow@3x.png │ │ ├── Moves │ │ ├── moves.png │ │ ├── moves@2x.png │ │ └── moves@3x.png │ │ ├── Sing │ │ ├── Sad │ │ │ ├── sad.png │ │ │ ├── sad@2x.png │ │ │ └── sad@3x.png │ │ ├── Beeps │ │ │ ├── beep.png │ │ │ ├── beep@2x.png │ │ │ └── beep@3x.png │ │ ├── Fart │ │ │ ├── fart1.png │ │ │ ├── fart2.png │ │ │ ├── fart3.png │ │ │ ├── fart1@2x.png │ │ │ ├── fart1@3x.png │ │ │ ├── fart2@2x.png │ │ │ ├── fart2@3x.png │ │ │ ├── fart3@2x.png │ │ │ └── fart3@3x.png │ │ ├── Mode │ │ │ ├── mode1.png │ │ │ ├── mode2.png │ │ │ ├── mode3.png │ │ │ ├── mode1@2x.png │ │ │ ├── mode1@3x.png │ │ │ ├── mode2@2x.png │ │ │ ├── mode2@3x.png │ │ │ ├── mode3@2x.png │ │ │ └── mode3@3x.png │ │ ├── Happy │ │ │ ├── happy.png │ │ │ ├── happy@2x.png │ │ │ └── happy@3x.png │ │ ├── OhOoh │ │ │ ├── OhOoh.png │ │ │ ├── OhOoh2.png │ │ │ ├── OhOoh2@2x.png │ │ │ ├── OhOoh2@3x.png │ │ │ ├── OhOoh@2x.png │ │ │ └── OhOoh@3x.png │ │ ├── Cuddly │ │ │ ├── cuddly.png │ │ │ ├── cuddly@2x.png │ │ │ └── cuddly@3x.png │ │ ├── Confused │ │ │ ├── confused.png │ │ │ ├── confused@2x.png │ │ │ └── confused@3x.png │ │ ├── Sleeping │ │ │ ├── sleeping.png │ │ │ ├── sleeping@2x.png │ │ │ └── sleeping@3x.png │ │ ├── Surprise │ │ │ ├── surprise.png │ │ │ ├── surprise@2x.png │ │ │ └── surprise@3x.png │ │ ├── Button │ │ │ ├── buttonPushed.png │ │ │ ├── buttonPushed@2x.png │ │ │ └── buttonPushed@3x.png │ │ ├── SuperHappy │ │ │ ├── superHappy.png │ │ │ ├── superHappy@2x.png │ │ │ └── superHappy@3x.png │ │ ├── Happy_short │ │ │ ├── happy_short.png │ │ │ ├── happy_short@2x.png │ │ │ └── happy_short@3x.png │ │ └── Disconnection │ │ │ ├── disconnection.png │ │ │ ├── disconnection@2x.png │ │ │ └── disconnection@3x.png │ │ ├── Swing │ │ ├── swing.png │ │ ├── swing@2x.png │ │ └── swing@3x.png │ │ ├── Ascend │ │ ├── ascend.png │ │ ├── ascend@2x.png │ │ └── ascend@3x.png │ │ ├── Battery │ │ ├── battery.png │ │ ├── battery@2x.png │ │ └── battery@3x.png │ │ ├── Bend │ │ ├── bendleft.png │ │ ├── bendright.png │ │ ├── bendleft@2x.png │ │ ├── bendleft@3x.png │ │ ├── bendright@2x.png │ │ └── bendright@3x.png │ │ ├── Border │ │ ├── border.png │ │ ├── border@2x.png │ │ └── border@3x.png │ │ ├── Cross │ │ ├── crossleft.png │ │ ├── crossright.png │ │ ├── crossleft@2x.png │ │ ├── crossleft@3x.png │ │ ├── crossright@2x.png │ │ └── crossright@3x.png │ │ ├── Eyes │ │ ├── Beep │ │ │ ├── beep.png │ │ │ ├── beep@2x.png │ │ │ └── beep@3x.png │ │ ├── Help │ │ │ ├── help.png │ │ │ ├── help@2x.png │ │ │ └── help@3x.png │ │ ├── Swing │ │ │ ├── swing.png │ │ │ ├── swing@2x.png │ │ │ └── swing@3x.png │ │ ├── Ascend │ │ │ ├── ascend.png │ │ │ ├── ascend@2x.png │ │ │ └── ascend@3x.png │ │ ├── Bend │ │ │ ├── bendleft.png │ │ │ ├── bendright.png │ │ │ ├── bendleft@2x.png │ │ │ ├── bendleft@3x.png │ │ │ ├── bendright@2x.png │ │ │ └── bendright@3x.png │ │ ├── Cross │ │ │ ├── crossleft.png │ │ │ ├── crossright.png │ │ │ ├── crossleft@2x.png │ │ │ ├── crossleft@3x.png │ │ │ ├── crossright@2x.png │ │ │ └── crossright@3x.png │ │ ├── Flap │ │ │ ├── flapback.png │ │ │ ├── flapfront.png │ │ │ ├── flapback@2x.png │ │ │ ├── flapback@3x.png │ │ │ ├── flapfront@2x.png │ │ │ └── flapfront@3x.png │ │ ├── Jitter │ │ │ ├── jitter.png │ │ │ ├── jitter@2x.png │ │ │ └── jitter@3x.png │ │ ├── Shake │ │ │ ├── shakeleft.png │ │ │ ├── shakeright.png │ │ │ ├── shakeleft@2x.png │ │ │ ├── shakeleft@3x.png │ │ │ ├── shakeright@2x.png │ │ │ └── shakeright@3x.png │ │ ├── Tiptoe │ │ │ ├── tiptoe.png │ │ │ ├── tiptoe@2x.png │ │ │ └── tiptoe@3x.png │ │ ├── Updown │ │ │ ├── updown.png │ │ │ ├── updown@2x.png │ │ │ └── updown@3x.png │ │ └── Moonwalk │ │ │ ├── moonwalkleft.png │ │ │ ├── moonwalkright.png │ │ │ ├── moonwalkleft@2x.png │ │ │ ├── moonwalkleft@3x.png │ │ │ ├── moonwalkright@2x.png │ │ │ └── moonwalkright@3x.png │ │ ├── Flap │ │ ├── flapback.png │ │ ├── flapfront.png │ │ ├── flapback@2x.png │ │ ├── flapback@3x.png │ │ ├── flapfront@2x.png │ │ └── flapfront@3x.png │ │ ├── Jitter │ │ ├── jitter.png │ │ ├── jitter@2x.png │ │ └── jitter@3x.png │ │ ├── Shake │ │ ├── shakeleft.png │ │ ├── shakeright.png │ │ ├── shakeleft@2x.png │ │ ├── shakeleft@3x.png │ │ ├── shakeright@2x.png │ │ └── shakeright@3x.png │ │ ├── Tiptoe │ │ ├── tiptoe.png │ │ ├── tiptoe@2x.png │ │ └── tiptoe@3x.png │ │ ├── Updown │ │ ├── updown.png │ │ ├── updown@2x.png │ │ └── updown@3x.png │ │ ├── Gestures │ │ ├── Sad │ │ │ ├── sad.png │ │ │ ├── sad@2x.png │ │ │ └── sad@3x.png │ │ ├── Angry │ │ │ ├── angry.png │ │ │ ├── angry@2x.png │ │ │ └── angry@3x.png │ │ ├── Fail │ │ │ ├── fail.png │ │ │ ├── fail@2x.png │ │ │ └── fail@3x.png │ │ ├── Fart │ │ │ ├── fart.png │ │ │ ├── fart@2x.png │ │ │ └── fart@3x.png │ │ ├── Happy │ │ │ ├── happy.png │ │ │ ├── happy@2x.png │ │ │ └── happy@3x.png │ │ ├── Love │ │ │ ├── love.png │ │ │ ├── love@2x.png │ │ │ └── love@3x.png │ │ ├── Magic │ │ │ ├── magic.png │ │ │ ├── magic@2x.png │ │ │ └── magic@3x.png │ │ ├── Wave │ │ │ ├── wave.png │ │ │ ├── wave@2x.png │ │ │ └── wave@3x.png │ │ ├── Fretful │ │ │ ├── fretful.png │ │ │ ├── fretful@2x.png │ │ │ └── fretful@3x.png │ │ ├── Victory │ │ │ ├── victory.png │ │ │ ├── victory@2x.png │ │ │ └── victory@3x.png │ │ ├── Confused │ │ │ ├── confused.png │ │ │ ├── confused@2x.png │ │ │ └── confused@3x.png │ │ ├── Sleeping │ │ │ ├── sleeping.png │ │ │ ├── sleeping@2x.png │ │ │ └── sleeping@3x.png │ │ └── SuperHappy │ │ │ ├── superhappy.png │ │ │ ├── superhappy@2x.png │ │ │ └── superhappy@3x.png │ │ ├── Wheels │ │ ├── Beep │ │ │ ├── beep.png │ │ │ ├── beep@2x.png │ │ │ └── beep@3x.png │ │ ├── Help │ │ │ ├── help.png │ │ │ ├── help@2x.png │ │ │ └── help@3x.png │ │ ├── Spin │ │ │ ├── spinleft.png │ │ │ ├── spinright.png │ │ │ ├── spinleft@2x.png │ │ │ ├── spinleft@3x.png │ │ │ ├── spinright@2x.png │ │ │ └── spinright@3x.png │ │ ├── Wigle │ │ │ ├── wigle.png │ │ │ ├── wigle@2x.png │ │ │ └── wigle@3x.png │ │ ├── Zigzag │ │ │ ├── zigzag.png │ │ │ ├── zigzag2.png │ │ │ ├── zigzag2@2x.png │ │ │ ├── zigzag2@3x.png │ │ │ ├── zigzag@2x.png │ │ │ └── zigzag@3x.png │ │ ├── Cross │ │ │ ├── crossleft.png │ │ │ ├── crossleft@2x.png │ │ │ ├── crossleft@3x.png │ │ │ ├── crossright.png │ │ │ ├── crossright@2x.png │ │ │ └── crossright@3x.png │ │ ├── Shake │ │ │ ├── shakeleft.png │ │ │ ├── shakeleft@2x.png │ │ │ ├── shakeleft@3x.png │ │ │ ├── shakeright.png │ │ │ ├── shakeright@2x.png │ │ │ └── shakeright@3x.png │ │ ├── Jiggle │ │ │ ├── jiggleleft.png │ │ │ ├── jiggleright.png │ │ │ ├── jiggleleft@2x.png │ │ │ ├── jiggleleft@3x.png │ │ │ ├── jiggleright@2x.png │ │ │ └── jiggleright@3x.png │ │ ├── Rotate │ │ │ ├── rotateleft.png │ │ │ ├── rotateright.png │ │ │ ├── rotateleft@2x.png │ │ │ ├── rotateleft@3x.png │ │ │ ├── rotateright@2x.png │ │ │ └── rotateright@3x.png │ │ └── Wabble │ │ │ ├── wabbleleft.png │ │ │ ├── wabbleright.png │ │ │ ├── wabbleleft@2x.png │ │ │ ├── wabbleleft@3x.png │ │ │ ├── wabbleright@2x.png │ │ │ └── wabbleright@3x.png │ │ ├── Bluetooth │ │ ├── bluetooth.png │ │ ├── bluetooth@2x.png │ │ └── bluetooth@3x.png │ │ ├── Humanoid │ │ ├── Beep │ │ │ ├── beep.png │ │ │ ├── beep@2x.png │ │ │ └── beep@3x.png │ │ ├── Face │ │ │ ├── face.png │ │ │ ├── face@2x.png │ │ │ └── face@3x.png │ │ ├── Help │ │ │ ├── help.png │ │ │ ├── help@2x.png │ │ │ └── help@3x.png │ │ ├── Swing │ │ │ ├── swing.png │ │ │ ├── swing@2x.png │ │ │ └── swing@3x.png │ │ ├── Bend │ │ │ ├── bendleft.png │ │ │ ├── bendleft@2x.png │ │ │ ├── bendleft@3x.png │ │ │ ├── bendright.png │ │ │ ├── bendright@2x.png │ │ │ └── bendright@3x.png │ │ ├── Flap │ │ │ ├── flapback.png │ │ │ ├── flapback@2x.png │ │ │ ├── flapback@3x.png │ │ │ ├── flapfront.png │ │ │ ├── flapfront@2x.png │ │ │ └── flapfront@3x.png │ │ ├── Hand │ │ │ ├── handleft.png │ │ │ ├── handsup.png │ │ │ ├── handleft@2x.png │ │ │ ├── handleft@3x.png │ │ │ ├── handright.png │ │ │ ├── handsup@2x.png │ │ │ ├── handsup@3x.png │ │ │ ├── handright@2x.png │ │ │ └── handright@3x.png │ │ ├── Mouth │ │ │ ├── Sad │ │ │ │ ├── sad.png │ │ │ │ ├── sad@2x.png │ │ │ │ └── sad@3x.png │ │ │ ├── Fail │ │ │ │ ├── fail.png │ │ │ │ ├── fail@2x.png │ │ │ │ └── fail@3x.png │ │ │ ├── Fart │ │ │ │ ├── fart.png │ │ │ │ ├── fart@2x.png │ │ │ │ └── fart@3x.png │ │ │ ├── Love │ │ │ │ ├── love.png │ │ │ │ ├── love@2x.png │ │ │ │ └── love@3x.png │ │ │ ├── Wave │ │ │ │ ├── wave.png │ │ │ │ ├── wave@2x.png │ │ │ │ └── wave@3x.png │ │ │ ├── Angry │ │ │ │ ├── angry.png │ │ │ │ ├── angry@2x.png │ │ │ │ └── angry@3x.png │ │ │ ├── Happy │ │ │ │ ├── happy.png │ │ │ │ ├── happy@2x.png │ │ │ │ └── happy@3x.png │ │ │ ├── Magic │ │ │ │ ├── magic.png │ │ │ │ ├── magic@2x.png │ │ │ │ └── magic@3x.png │ │ │ ├── Fretful │ │ │ │ ├── fretful.png │ │ │ │ ├── fretful@2x.png │ │ │ │ └── fretful@3x.png │ │ │ ├── Victory │ │ │ │ ├── victory.png │ │ │ │ ├── victory@2x.png │ │ │ │ └── victory@3x.png │ │ │ ├── Confused │ │ │ │ ├── confused.png │ │ │ │ ├── confused@2x.png │ │ │ │ └── confused@3x.png │ │ │ ├── Sleeping │ │ │ │ ├── sleeping.png │ │ │ │ ├── sleeping@2x.png │ │ │ │ └── sleeping@3x.png │ │ │ └── SuperHappy │ │ │ │ ├── superhappy.png │ │ │ │ ├── superhappy@2x.png │ │ │ │ └── superhappy@3x.png │ │ ├── Updown │ │ │ ├── updown.png │ │ │ ├── updown@2x.png │ │ │ └── updown@3x.png │ │ ├── Cross │ │ │ ├── crossleft.png │ │ │ ├── crossright.png │ │ │ ├── crossleft@2x.png │ │ │ ├── crossleft@3x.png │ │ │ ├── crossright@2x.png │ │ │ └── crossright@3x.png │ │ ├── Shake │ │ │ ├── shakeleft.png │ │ │ ├── shakeright.png │ │ │ ├── shakeleft@2x.png │ │ │ ├── shakeleft@3x.png │ │ │ ├── shakeright@2x.png │ │ │ └── shakeright@3x.png │ │ └── Moonwalk │ │ │ ├── moonwalkleft.png │ │ │ ├── moonwalkright.png │ │ │ ├── moonwalkleft@2x.png │ │ │ ├── moonwalkleft@3x.png │ │ │ ├── moonwalkright@2x.png │ │ │ └── moonwalkright@3x.png │ │ ├── Moonwalk │ │ ├── moonwalkleft.png │ │ ├── moonwalkright.png │ │ ├── moonwalkleft@2x.png │ │ ├── moonwalkleft@3x.png │ │ ├── moonwalkright@2x.png │ │ └── moonwalkright@3x.png │ │ └── Ultrasound │ │ ├── ultrasound.png │ │ ├── ultrasound@2x.png │ │ └── ultrasound@3x.png ├── mouths.html ├── gestures.html ├── songs.html ├── moves.html └── remote-control.html ├── gestures.py ├── songs.py ├── batReader9.py ├── LICENSE ├── Otto_allmoves_V9.py ├── store.py ├── README.md ├── otto_font.py ├── otto_servo.py ├── us.py ├── notes.py ├── CODE_OF_CONDUCT.md ├── oscillator.py ├── assets.json ├── mouths.py ├── otto_matrix.py └── otto_remote.py /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | .idea -------------------------------------------------------------------------------- /web/mainInfo.js: -------------------------------------------------------------------------------- 1 | mainPage = '/edu.html'; 2 | mainTitle = 'EduBlocks'; -------------------------------------------------------------------------------- /web/images/Control/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/left.png -------------------------------------------------------------------------------- /web/images/Control/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/right.png -------------------------------------------------------------------------------- /web/images/Control/control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/control.png -------------------------------------------------------------------------------- /web/images/Control/forward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/forward.png -------------------------------------------------------------------------------- /web/images/Control/left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/left@2x.png -------------------------------------------------------------------------------- /web/images/Control/left@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/left@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Help/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Help/help.png -------------------------------------------------------------------------------- /web/images/Buttons/Speed/fast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Speed/fast.png -------------------------------------------------------------------------------- /web/images/Buttons/Speed/slow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Speed/slow.png -------------------------------------------------------------------------------- /web/images/Control/backward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/backward.png -------------------------------------------------------------------------------- /web/images/Control/control@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/control@2x.png -------------------------------------------------------------------------------- /web/images/Control/control@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/control@3x.png -------------------------------------------------------------------------------- /web/images/Control/controls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/controls.png -------------------------------------------------------------------------------- /web/images/Control/forward@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/forward@2x.png -------------------------------------------------------------------------------- /web/images/Control/forward@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/forward@3x.png -------------------------------------------------------------------------------- /web/images/Control/right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/right@2x.png -------------------------------------------------------------------------------- /web/images/Control/right@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/right@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Help/help@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Help/help@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Help/help@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Help/help@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Moves/moves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Moves/moves.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Sad/sad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Sad/sad.png -------------------------------------------------------------------------------- /web/images/Buttons/Speed/medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Speed/medium.png -------------------------------------------------------------------------------- /web/images/Buttons/Swing/swing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Swing/swing.png -------------------------------------------------------------------------------- /web/images/Control/backward@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/backward@2x.png -------------------------------------------------------------------------------- /web/images/Control/backward@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/backward@3x.png -------------------------------------------------------------------------------- /web/images/Control/controls@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/controls@2x.png -------------------------------------------------------------------------------- /web/images/Control/controls@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Control/controls@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Ascend/ascend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Ascend/ascend.png -------------------------------------------------------------------------------- /web/images/Buttons/Battery/battery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Battery/battery.png -------------------------------------------------------------------------------- /web/images/Buttons/Bend/bendleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Bend/bendleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Bend/bendright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Bend/bendright.png -------------------------------------------------------------------------------- /web/images/Buttons/Border/border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Border/border.png -------------------------------------------------------------------------------- /web/images/Buttons/Cross/crossleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Cross/crossleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Beep/beep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Beep/beep.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Help/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Help/help.png -------------------------------------------------------------------------------- /web/images/Buttons/Flap/flapback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Flap/flapback.png -------------------------------------------------------------------------------- /web/images/Buttons/Flap/flapfront.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Flap/flapfront.png -------------------------------------------------------------------------------- /web/images/Buttons/Jitter/jitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Jitter/jitter.png -------------------------------------------------------------------------------- /web/images/Buttons/Moves/moves@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Moves/moves@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Moves/moves@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Moves/moves@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Shake/shakeleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Shake/shakeleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Beeps/beep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Beeps/beep.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Fart/fart1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Fart/fart1.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Fart/fart2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Fart/fart2.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Fart/fart3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Fart/fart3.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Mode/mode1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Mode/mode1.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Mode/mode2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Mode/mode2.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Mode/mode3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Mode/mode3.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Sad/sad@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Sad/sad@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Sad/sad@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Sad/sad@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Speed/fast@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Speed/fast@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Speed/fast@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Speed/fast@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Speed/medium@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Speed/medium@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Speed/medium@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Speed/medium@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Speed/slow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Speed/slow@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Speed/slow@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Speed/slow@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Swing/swing@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Swing/swing@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Swing/swing@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Swing/swing@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Tiptoe/tiptoe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Tiptoe/tiptoe.png -------------------------------------------------------------------------------- /web/images/Buttons/Updown/updown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Updown/updown.png -------------------------------------------------------------------------------- /web/images/Buttons/Ascend/ascend@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Ascend/ascend@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Ascend/ascend@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Ascend/ascend@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Bend/bendleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Bend/bendleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Bend/bendleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Bend/bendleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Bend/bendright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Bend/bendright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Bend/bendright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Bend/bendright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Border/border@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Border/border@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Border/border@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Border/border@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Cross/crossright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Cross/crossright.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Beep/beep@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Beep/beep@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Beep/beep@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Beep/beep@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Help/help@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Help/help@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Help/help@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Help/help@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Swing/swing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Swing/swing.png -------------------------------------------------------------------------------- /web/images/Buttons/Flap/flapback@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Flap/flapback@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Flap/flapback@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Flap/flapback@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Flap/flapfront@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Flap/flapfront@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Flap/flapfront@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Flap/flapfront@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Sad/sad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Sad/sad.png -------------------------------------------------------------------------------- /web/images/Buttons/Jitter/jitter@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Jitter/jitter@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Jitter/jitter@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Jitter/jitter@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Shake/shakeright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Shake/shakeright.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Happy/happy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Happy/happy.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/OhOoh/OhOoh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/OhOoh/OhOoh.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/OhOoh/OhOoh2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/OhOoh/OhOoh2.png -------------------------------------------------------------------------------- /web/images/Buttons/Tiptoe/tiptoe@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Tiptoe/tiptoe@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Tiptoe/tiptoe@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Tiptoe/tiptoe@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Updown/updown@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Updown/updown@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Updown/updown@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Updown/updown@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Beep/beep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Beep/beep.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Help/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Help/help.png -------------------------------------------------------------------------------- /web/images/Buttons/Battery/battery@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Battery/battery@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Battery/battery@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Battery/battery@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Bluetooth/bluetooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Bluetooth/bluetooth.png -------------------------------------------------------------------------------- /web/images/Buttons/Cross/crossleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Cross/crossleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Cross/crossleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Cross/crossleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Cross/crossright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Cross/crossright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Cross/crossright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Cross/crossright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Ascend/ascend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Ascend/ascend.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Bend/bendleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Bend/bendleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Bend/bendright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Bend/bendright.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Cross/crossleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Cross/crossleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Flap/flapback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Flap/flapback.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Flap/flapfront.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Flap/flapfront.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Jitter/jitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Jitter/jitter.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Shake/shakeleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Shake/shakeleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Swing/swing@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Swing/swing@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Swing/swing@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Swing/swing@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Tiptoe/tiptoe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Tiptoe/tiptoe.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Updown/updown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Updown/updown.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Angry/angry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Angry/angry.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Fail/fail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Fail/fail.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Fart/fart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Fart/fart.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Happy/happy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Happy/happy.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Love/love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Love/love.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Magic/magic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Magic/magic.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Sad/sad@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Sad/sad@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Sad/sad@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Sad/sad@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Wave/wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Wave/wave.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Beep/beep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Beep/beep.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Face/face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Face/face.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Help/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Help/help.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Swing/swing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Swing/swing.png -------------------------------------------------------------------------------- /web/images/Buttons/Shake/shakeleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Shake/shakeleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Shake/shakeleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Shake/shakeleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Shake/shakeright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Shake/shakeright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Shake/shakeright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Shake/shakeright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Beeps/beep@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Beeps/beep@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Beeps/beep@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Beeps/beep@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Cuddly/cuddly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Cuddly/cuddly.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Fart/fart1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Fart/fart1@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Fart/fart1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Fart/fart1@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Fart/fart2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Fart/fart2@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Fart/fart2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Fart/fart2@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Fart/fart3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Fart/fart3@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Fart/fart3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Fart/fart3@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Happy/happy@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Happy/happy@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Happy/happy@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Happy/happy@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Mode/mode1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Mode/mode1@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Mode/mode1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Mode/mode1@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Mode/mode2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Mode/mode2@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Mode/mode2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Mode/mode2@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Mode/mode3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Mode/mode3@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Mode/mode3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Mode/mode3@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/OhOoh/OhOoh2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/OhOoh/OhOoh2@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/OhOoh/OhOoh2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/OhOoh/OhOoh2@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/OhOoh/OhOoh@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/OhOoh/OhOoh@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/OhOoh/OhOoh@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/OhOoh/OhOoh@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Beep/beep@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Beep/beep@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Beep/beep@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Beep/beep@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Help/help@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Help/help@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Help/help@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Help/help@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Spin/spinleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Spin/spinleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Wigle/wigle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Wigle/wigle.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Zigzag/zigzag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Zigzag/zigzag.png -------------------------------------------------------------------------------- /web/images/Buttons/Bluetooth/bluetooth@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Bluetooth/bluetooth@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Bluetooth/bluetooth@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Bluetooth/bluetooth@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Ascend/ascend@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Ascend/ascend@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Ascend/ascend@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Ascend/ascend@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Bend/bendleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Bend/bendleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Bend/bendleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Bend/bendleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Bend/bendright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Bend/bendright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Bend/bendright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Bend/bendright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Cross/crossright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Cross/crossright.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Flap/flapback@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Flap/flapback@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Flap/flapback@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Flap/flapback@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Flap/flapfront@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Flap/flapfront@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Flap/flapfront@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Flap/flapfront@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Jitter/jitter@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Jitter/jitter@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Jitter/jitter@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Jitter/jitter@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Shake/shakeright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Shake/shakeright.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Tiptoe/tiptoe@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Tiptoe/tiptoe@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Tiptoe/tiptoe@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Tiptoe/tiptoe@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Updown/updown@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Updown/updown@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Updown/updown@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Updown/updown@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Fail/fail@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Fail/fail@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Fail/fail@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Fail/fail@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Fart/fart@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Fart/fart@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Fart/fart@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Fart/fart@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Love/love@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Love/love@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Love/love@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Love/love@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Wave/wave@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Wave/wave@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Wave/wave@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Wave/wave@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Beep/beep@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Beep/beep@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Beep/beep@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Beep/beep@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Bend/bendleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Bend/bendleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Face/face@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Face/face@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Face/face@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Face/face@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Flap/flapback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Flap/flapback.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Hand/handleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Hand/handleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Hand/handsup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Hand/handsup.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Help/help@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Help/help@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Help/help@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Help/help@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Sad/sad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Sad/sad.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Updown/updown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Updown/updown.png -------------------------------------------------------------------------------- /web/images/Buttons/Moonwalk/moonwalkleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Moonwalk/moonwalkleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Moonwalk/moonwalkright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Moonwalk/moonwalkright.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Confused/confused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Confused/confused.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Cuddly/cuddly@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Cuddly/cuddly@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Cuddly/cuddly@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Cuddly/cuddly@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Sleeping/sleeping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Sleeping/sleeping.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Surprise/surprise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Surprise/surprise.png -------------------------------------------------------------------------------- /web/images/Buttons/Ultrasound/ultrasound.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Ultrasound/ultrasound.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Cross/crossleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Cross/crossleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Shake/shakeleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Shake/shakeleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Spin/spinright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Spin/spinright.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Wigle/wigle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Wigle/wigle@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Wigle/wigle@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Wigle/wigle@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Zigzag/zigzag2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Zigzag/zigzag2.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Cross/crossleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Cross/crossleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Cross/crossleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Cross/crossleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Cross/crossright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Cross/crossright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Cross/crossright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Cross/crossright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Shake/shakeleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Shake/shakeleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Shake/shakeleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Shake/shakeleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Shake/shakeright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Shake/shakeright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Shake/shakeright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Shake/shakeright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Angry/angry@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Angry/angry@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Angry/angry@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Angry/angry@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Fretful/fretful.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Fretful/fretful.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Happy/happy@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Happy/happy@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Happy/happy@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Happy/happy@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Magic/magic@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Magic/magic@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Magic/magic@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Magic/magic@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Victory/victory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Victory/victory.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Bend/bendleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Bend/bendleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Bend/bendleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Bend/bendleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Bend/bendright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Bend/bendright.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Cross/crossleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Cross/crossleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Cross/crossright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Cross/crossright.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Flap/flapback@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Flap/flapback@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Flap/flapback@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Flap/flapback@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Flap/flapfront.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Flap/flapfront.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Hand/handleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Hand/handleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Hand/handleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Hand/handleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Hand/handright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Hand/handright.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Hand/handsup@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Hand/handsup@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Hand/handsup@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Hand/handsup@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Fail/fail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Fail/fail.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Fart/fart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Fart/fart.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Love/love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Love/love.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Sad/sad@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Sad/sad@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Sad/sad@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Sad/sad@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Wave/wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Wave/wave.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Shake/shakeleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Shake/shakeleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Shake/shakeright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Shake/shakeright.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Swing/swing@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Swing/swing@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Swing/swing@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Swing/swing@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Updown/updown@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Updown/updown@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Updown/updown@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Updown/updown@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Moonwalk/moonwalkleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Moonwalk/moonwalkleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Moonwalk/moonwalkleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Moonwalk/moonwalkleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Moonwalk/moonwalkright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Moonwalk/moonwalkright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Moonwalk/moonwalkright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Moonwalk/moonwalkright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Button/buttonPushed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Button/buttonPushed.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Confused/confused@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Confused/confused@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Confused/confused@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Confused/confused@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Sleeping/sleeping@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Sleeping/sleeping@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Sleeping/sleeping@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Sleeping/sleeping@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Surprise/surprise@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Surprise/surprise@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Surprise/surprise@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Surprise/surprise@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Ultrasound/ultrasound@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Ultrasound/ultrasound@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Ultrasound/ultrasound@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Ultrasound/ultrasound@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Cross/crossleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Cross/crossleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Cross/crossleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Cross/crossleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Cross/crossright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Cross/crossright.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Jiggle/jiggleleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Jiggle/jiggleleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Jiggle/jiggleright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Jiggle/jiggleright.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Rotate/rotateleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Rotate/rotateleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Rotate/rotateright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Rotate/rotateright.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Shake/shakeleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Shake/shakeleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Shake/shakeleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Shake/shakeleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Shake/shakeright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Shake/shakeright.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Spin/spinleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Spin/spinleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Spin/spinleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Spin/spinleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Spin/spinright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Spin/spinright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Spin/spinright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Spin/spinright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Wabble/wabbleleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Wabble/wabbleleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Wabble/wabbleright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Wabble/wabbleright.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Zigzag/zigzag2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Zigzag/zigzag2@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Zigzag/zigzag2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Zigzag/zigzag2@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Zigzag/zigzag@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Zigzag/zigzag@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Zigzag/zigzag@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Zigzag/zigzag@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Moonwalk/moonwalkleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Moonwalk/moonwalkleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Moonwalk/moonwalkright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Moonwalk/moonwalkright.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Confused/confused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Confused/confused.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Fretful/fretful@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Fretful/fretful@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Fretful/fretful@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Fretful/fretful@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Sleeping/sleeping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Sleeping/sleeping.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Victory/victory@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Victory/victory@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Victory/victory@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Victory/victory@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Bend/bendright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Bend/bendright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Bend/bendright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Bend/bendright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Cross/crossleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Cross/crossleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Cross/crossleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Cross/crossleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Flap/flapfront@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Flap/flapfront@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Flap/flapfront@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Flap/flapfront@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Hand/handright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Hand/handright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Hand/handright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Hand/handright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Angry/angry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Angry/angry.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Fail/fail@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Fail/fail@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Fail/fail@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Fail/fail@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Fart/fart@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Fart/fart@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Fart/fart@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Fart/fart@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Happy/happy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Happy/happy.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Love/love@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Love/love@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Love/love@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Love/love@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Magic/magic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Magic/magic.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Wave/wave@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Wave/wave@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Wave/wave@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Wave/wave@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Shake/shakeleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Shake/shakeleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Shake/shakeleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Shake/shakeleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Button/buttonPushed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Button/buttonPushed@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Button/buttonPushed@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Button/buttonPushed@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/SuperHappy/superHappy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/SuperHappy/superHappy.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Cross/crossright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Cross/crossright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Cross/crossright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Cross/crossright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Jiggle/jiggleleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Jiggle/jiggleleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Jiggle/jiggleleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Jiggle/jiggleleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Rotate/rotateleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Rotate/rotateleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Rotate/rotateleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Rotate/rotateleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Shake/shakeright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Shake/shakeright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Shake/shakeright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Shake/shakeright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Wabble/wabbleleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Wabble/wabbleleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Wabble/wabbleleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Wabble/wabbleleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Moonwalk/moonwalkleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Moonwalk/moonwalkleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Moonwalk/moonwalkleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Moonwalk/moonwalkleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Moonwalk/moonwalkright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Moonwalk/moonwalkright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Eyes/Moonwalk/moonwalkright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Eyes/Moonwalk/moonwalkright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Confused/confused@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Confused/confused@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Confused/confused@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Confused/confused@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Sleeping/sleeping@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Sleeping/sleeping@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/Sleeping/sleeping@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/Sleeping/sleeping@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/SuperHappy/superhappy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/SuperHappy/superhappy.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Cross/crossright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Cross/crossright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Cross/crossright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Cross/crossright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Moonwalk/moonwalkleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Moonwalk/moonwalkleft.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Angry/angry@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Angry/angry@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Angry/angry@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Angry/angry@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Fretful/fretful.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Fretful/fretful.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Happy/happy@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Happy/happy@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Happy/happy@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Happy/happy@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Magic/magic@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Magic/magic@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Magic/magic@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Magic/magic@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Victory/victory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Victory/victory.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Shake/shakeright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Shake/shakeright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Shake/shakeright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Shake/shakeright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Happy_short/happy_short.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Happy_short/happy_short.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/SuperHappy/superHappy@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/SuperHappy/superHappy@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/SuperHappy/superHappy@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/SuperHappy/superHappy@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Jiggle/jiggleright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Jiggle/jiggleright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Jiggle/jiggleright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Jiggle/jiggleright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Rotate/rotateright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Rotate/rotateright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Rotate/rotateright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Rotate/rotateright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Wabble/wabbleright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Wabble/wabbleright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Wheels/Wabble/wabbleright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Wheels/Wabble/wabbleright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Moonwalk/moonwalkright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Moonwalk/moonwalkright.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Confused/confused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Confused/confused.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Sleeping/sleeping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Sleeping/sleeping.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Disconnection/disconnection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Disconnection/disconnection.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Happy_short/happy_short@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Happy_short/happy_short@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Happy_short/happy_short@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Happy_short/happy_short@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/SuperHappy/superhappy@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/SuperHappy/superhappy@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Gestures/SuperHappy/superhappy@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Gestures/SuperHappy/superhappy@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Moonwalk/moonwalkleft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Moonwalk/moonwalkleft@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Moonwalk/moonwalkleft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Moonwalk/moonwalkleft@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Moonwalk/moonwalkright@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Moonwalk/moonwalkright@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Moonwalk/moonwalkright@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Moonwalk/moonwalkright@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Confused/confused@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Confused/confused@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Confused/confused@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Confused/confused@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Fretful/fretful@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Fretful/fretful@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Fretful/fretful@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Fretful/fretful@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Sleeping/sleeping@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Sleeping/sleeping@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Sleeping/sleeping@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Sleeping/sleeping@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Victory/victory@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Victory/victory@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/Victory/victory@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/Victory/victory@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Disconnection/disconnection@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Disconnection/disconnection@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Sing/Disconnection/disconnection@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Sing/Disconnection/disconnection@3x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/SuperHappy/superhappy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/SuperHappy/superhappy.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/SuperHappy/superhappy@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/SuperHappy/superhappy@2x.png -------------------------------------------------------------------------------- /web/images/Buttons/Humanoid/Mouth/SuperHappy/superhappy@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OttoDIY/OttoDIYPython/HEAD/web/images/Buttons/Humanoid/Mouth/SuperHappy/superhappy@3x.png -------------------------------------------------------------------------------- /gestures.py: -------------------------------------------------------------------------------- 1 | 2 | #-- gestures supported by Otto 3 | #-- OttDIY Python Project, 2020 4 | 5 | OTTOHAPPY = const(0) 6 | OTTOSUPERHAPPY = const(1) 7 | OTTOSAD = const(2) 8 | OTTOSLEEPING = const(3) 9 | OTTOFART = const(4) 10 | OTTOCONFUSED = const(5) 11 | OTTOLOVE = const(6) 12 | OTTOANGRY = const(7) 13 | OTTOFRETFUL = const(8) 14 | OTTOMAGIC = const(9) 15 | OTTOWAVE = const(10) 16 | OTTOVICTORY = const(11) 17 | OTTOFAIL = const(12) 18 | -------------------------------------------------------------------------------- /songs.py: -------------------------------------------------------------------------------- 1 | #-- Song CONSTANTS for otto9 2 | #-- OttDIY Python Project, 2020 3 | 4 | CONNECTION = const(0) 5 | DISCONNECTION = const(1) 6 | SURPRISE = const(2) 7 | OHOOH = const(3) 8 | OHOOH2 = const(4) 9 | CUDDLY = const(5) 10 | SLEEPING = const(6) 11 | HAPPY = const(7) 12 | SUPERHAPPY = const(8) 13 | HAPPYSHORT = const(9) 14 | SAD = const(10) 15 | CONFUSED = const(11) 16 | FART1 = const(12) 17 | FART2 = const(13) 18 | FART3 = const(14) 19 | MODE1 = const(15) 20 | MODE2 = const(16) 21 | MODE3 = const(17) 22 | BUTTONPUSHED = const(18) 23 | -------------------------------------------------------------------------------- /batReader9.py: -------------------------------------------------------------------------------- 1 | # this is the code for reading the battery 2 | 3 | from machine import Pin, ADC 4 | 5 | MAX_VOLTAGE = 7.6 6 | BAT_MAX = 4.8 7 | BAT_MIN = 3.25 8 | 9 | 10 | class BatReader9: 11 | def __init__(self, pin = 34): 12 | self.batPin = ADC(Pin(pin)) 13 | self.batPin.atten(ADC.ATTN_11DB) 14 | self.batPin.width(ADC.WIDTH_12BIT) 15 | 16 | def readBatVoltage(self): 17 | try: 18 | volt = round(self.batPin.raw_to_voltage(self.batPin.read()) * 2 / 1000.0, 2) 19 | except AttributeError: 20 | volt = round(self.batPin.read() * MAX_VOLTAGE / 4096.0, 2) 21 | if volt < BAT_MIN: 22 | volt = BAT_MIN 23 | elif volt > BAT_MAX: 24 | volt = BAT_MAX 25 | 26 | return volt 27 | 28 | def readBatPercent(self): 29 | percent = round((self.readBatVoltage() - BAT_MIN) / (BAT_MAX - BAT_MIN) * 100, 2) 30 | if percent < 0: 31 | percent = 0 32 | elif percent > 100: 33 | percent = 100 34 | return percent 35 | 36 | def read(self): 37 | return self.batPin.read() 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Scotty Franzyshen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Otto_allmoves_V9.py: -------------------------------------------------------------------------------- 1 | #-- Otto All moves python test 2 | #-- OttDIY Python Project, 2020 3 | 4 | import otto9, time 5 | 6 | Otto = otto9.Otto9() 7 | Otto.init(5, 12, 13, 14, True, 0, 1, 2, 3) 8 | Otto.home() 9 | 10 | Otto.walk(2, 1000, FORWARD) #-- 2 steps, "TIME". IF HIGHER THE VALUE THEN SLOWER (from 600 to 1400), 1 FORWARD 11 | Otto.walk(2, 1000, BACKWARD) #-- 2 steps, T, -1 BACKWARD 12 | Otto.turn(2, 1000, LEFT) #-- 3 steps turning LEFT 13 | Otto.home() 14 | time.sleep_ms(100) 15 | Otto.turn(2, 1000, RIGHT) #-- 3 steps turning RIGHT 16 | Otto.bend(1, 500, LEFT) #-- usually steps =1, T=2000 17 | Otto.bend(1, 2000, RIGHT) 18 | Otto.shakeLeg(1, 1500, LEFT) 19 | Otto.home() 20 | time.sleep_ms(100) 21 | Otto.shakeLeg(1, 2000, RIGHT) 22 | Otto.moonwalker(3, 1000, 25, LEFT) #-- LEFT 23 | Otto.moonwalker(3, 1000, 25, RIGHT) #-- RIGHT 24 | Otto.crusaito(2, 1000, 20, LEFT) 25 | Otto.crusaito(2, 1000, 20, RIGHT) 26 | time.sleep_ms(100) 27 | Otto.flapping(2, 1000, 20, LEFT) 28 | Otto.flapping(2, 1000, 20, RIGHT) 29 | time.sleep_ms(100) 30 | Otto.swing(2, 1000, 20) 31 | Otto.tiptoeSwing(2, 1000, 20) 32 | Otto.jitter(2, 1000, 20) #-- (small T) 33 | Otto.updown(2, 1500, 20) #-- 20 = H "HEIGHT of movement"T 34 | Otto.ascendingTurn(2, 1000, 50) 35 | Otto.jump(1, 2000) 36 | 37 | Otto.home() 38 | 39 | #end 40 | -------------------------------------------------------------------------------- /store.py: -------------------------------------------------------------------------------- 1 | #-- OttDIY Python Project, 2020 2 | # 3 | # import json 4 | # import os 5 | # 6 | # STOREDIR = '/eeprom' 7 | # 8 | # 9 | # def save(key, value): 10 | # try: 11 | # stat = os.stat(STOREDIR) 12 | # except: 13 | # os.mkdir(STOREDIR) 14 | # 15 | # filename = STOREDIR + '/' + key + '.json' 16 | # f = open(filename, 'w') 17 | # json_str = json.dumps(value) 18 | # f.write(json_str) 19 | # f.close() 20 | # 21 | # 22 | # def load(key, default = None): 23 | # filename = STOREDIR + '/' + key + '.json' 24 | # 25 | # try: 26 | # f = open(filename) 27 | # json_str = f.read() 28 | # value = json.loads(json_str) 29 | # f.close() 30 | # return value 31 | # except: 32 | # if default == None: 33 | # raise ValueError() 34 | # return default 35 | 36 | import json 37 | import os 38 | from esp32 import NVS 39 | 40 | 41 | def save(key, value, namespace='Eeprom'): 42 | nvs = NVS(namespace) 43 | json_str = json.dumps(value) 44 | nvs.set_blob(key, json_str) 45 | 46 | # don't forget to commit 47 | nvs.commit() 48 | 49 | 50 | def load(key, default=None, namespace='Eeprom'): 51 | nvs = NVS(namespace) 52 | buf = bytearray(1000) 53 | 54 | try: 55 | nvs.get_blob(key, buf) 56 | value = json.loads(buf) 57 | return value 58 | except Exception as _: 59 | if default is None: 60 | raise ValueError() 61 | return default 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OttoDIYPython 2 | 3 | This is a port of the OttoDIY Robot API ([Otto9.h](https://github.com/OttoDIY/OttoDIYLib/blob/master/Otto9.h) & Otto9Humanoid.h) to a [micropython based esp platform](https://docs.micropython.org/en/latest/esp8266/tutorial/intro.html) 4 | 5 | This project has just begun ... it's not ready for use yet ... [please look at 6 | the issues](https://github.com/OttoDIY/OttoDIYPython/issues) to see if you can help make this a reality ... 7 | 8 | we now have added the humanoid support 😄 ... [Read this issue post](https://github.com/OttoDIY/OttoDIYPython/issues/17) to see how it's used ... 9 | 10 | The Motion Code has been ported ... and a test file has been created ... to test this out 11 | 12 | 1) Install Micropython onto your microcontroller (I used a esp8266 nodemcu board) 13 | 2) Upload these files on to the board ... Use uPyCraft or ampy 14 | 3) run the Otto_allmoves_V9.py file from the REPL with the following command 15 | 16 | `>>> exec(open('./Otto_allmoves_V9.py').read(),globals())` 17 | 18 | ### Example Code 19 | ``` 20 | """ 21 | Otto All moves python test 22 | OttDIY Python Project, 2020 | sfranzyshen 23 | """ 24 | import otto9, time 25 | 26 | Otto = otto9.Otto9() 27 | Otto.init(5, 12, 13, 14, True, 0, 1, 2, 3) 28 | Otto.home() 29 | 30 | Otto.walk(2, 1000, 1) #-- 2 steps, "TIME". IF HIGHER THE VALUE THEN SLOWER (from 600 to 1400), 1 FORWARD 31 | Otto.walk(2, 1000, -1) #-- 2 steps, T, -1 BACKWARD 32 | Otto.turn(2, 1000, 1) #-- 3 steps turning LEFT 33 | Otto.home() 34 | time.sleep_ms(100) 35 | Otto.turn(2, 1000, -1) #-- 3 steps turning RIGHT 36 | Otto.bend(1, 500, 1) #-- usually steps =1, T=2000 37 | Otto.bend(1, 2000, -1) 38 | Otto.shakeLeg(1, 1500, 1) 39 | Otto.home() 40 | ``` 41 | -------------------------------------------------------------------------------- /otto_font.py: -------------------------------------------------------------------------------- 1 | #-- OttDIY Python Project, 2020 2 | 3 | font_6x8 = { 4 | '0': b'\x00\x7C\x82\x82\x7C\x00', 5 | '1': b'\x00\x42\xFE\x02\x00\x00', 6 | '2': b'\x00\x46\x8A\x92\x62\x00', 7 | '3': b'\x00\x44\x92\x92\x6C\x00', 8 | '4': b'\x00\x1C\x64\xFE\x04\x00', 9 | '5': b'\x00\xF2\x92\x92\x8C\x00', 10 | '6': b'\x00\x7C\x92\x92\x4C\x00', 11 | '7': b'\x00\xC0\x8E\x90\xE0\x00', 12 | '8': b'\x00\x6C\x92\x92\x6C\x00', 13 | '9': b'\x00\x64\x92\x92\x7C\x00', 14 | ':': b'\x00\x00\x14\x00\x00\x00', 15 | ';': b'\x00\x02\x24\x00\x00\x00', 16 | '<': b'\x00\x10\x28\x44\x82\x00', 17 | '=': b'\x00\x28\x28\x28\x28\x00', 18 | '>': b'\x00\x82\x44\x28\x10\x00', 19 | '?': b'\x00\x20\x4a\x30\x00\x00', 20 | '@': b'\x00\x00\x00\x00\x00\x00', 21 | 'A': b'\x00\x7E\x88\x88\x7E\x00', 22 | 'B': b'\x00\xFE\x92\x92\x6C\x00', 23 | 'C': b'\x00\x7C\x82\x82\x44\x00', 24 | 'D': b'\x00\xFE\x82\x82\x7C\x00', 25 | 'E': b'\x00\xFE\x92\x92\x82\x00', 26 | 'F': b'\x00\xFE\x90\x90\x80\x00', 27 | 'G': b'\x00\x7C\x82\x92\x5C\x00', 28 | 'H': b'\x00\xFE\x10\x10\xFE\x00', 29 | 'I': b'\x00\x82\xFE\x82\x00\x00', 30 | 'J': b'\x00\x0C\x02\x02\xFC\x00', 31 | 'K': b'\x00\xFE\x10\x28\xC6\x00', 32 | 'L': b'\x00\xFE\x02\x02\x02\x00', 33 | 'M': b'\x00\xFE\x40\x30\x40\xFE', 34 | 'N': b'\x00\xFE\x40\x30\x08\xFE', 35 | 'O': b'\x00\x7C\x82\x82\x82\x7C', 36 | 'P': b'\x00\xFE\x90\x90\x60\x00', 37 | 'Q': b'\x00\x7C\x82\x8A\x84\x7A', 38 | 'R': b'\x00\xFE\x98\x94\x62\x00', 39 | 'S': b'\x00\x64\x92\x92\x4C\x00', 40 | 'T': b'\x00\x80\xFE\x80\x80\x00', 41 | 'U': b'\x00\xFC\x02\x02\xFC\x00', 42 | 'V': b'\x00\xF0\x0C\x02\x0C\xF0', 43 | 'W': b'\x00\xFE\x04\x38\x04\xFE', 44 | 'X': b'\x00\xC6\x38\x38\xC6\x00', 45 | 'Y': b'\xC0\x20\x1E\x20\xC0\x00', 46 | 'Z': b'\x00\x86\x9A\xB2\xC2\x00', 47 | '!': b'\x00\x00\x7a\x00\x00\x00', 48 | ' ': b'\x00\x00\x00\x00\x00\x00' 49 | } 50 | -------------------------------------------------------------------------------- /otto_servo.py: -------------------------------------------------------------------------------- 1 | #-- A simple class for controlling hobby servos. Modeled after the ESP8266 Arduino Servo Driver 2 | #-- OttDIY Python Project, 2020 3 | 4 | import machine 5 | 6 | try: 7 | from esp32 import Servo as espServo 8 | useServo = True 9 | except ImportError: 10 | """This version of esp32 doesn't support Servo, use PWM instead""" 11 | def espServo(_arg): 12 | print("espServo not defined") 13 | raise ImportError 14 | useServo = False 15 | 16 | 17 | class Servo: 18 | def __init__(self, freq = 50, min_us = 1000, max_us = 2000, max_ang = 180): 19 | global useServo 20 | self.min_us = min_us 21 | self.max_us = max_us 22 | self.freq = freq 23 | self.max_ang = max_ang 24 | self.pin = None 25 | if useServo: 26 | self.servo = None 27 | else: 28 | self.pwm = None 29 | self._attached = False 30 | 31 | def attach(self, pin): 32 | global useServo 33 | self.pin = machine.Pin(pin) 34 | if useServo: 35 | self.servo = espServo(self.pin) 36 | else: 37 | self.pwm = machine.PWM(self.pin, freq = self.freq) 38 | self._attached = True 39 | 40 | def detach(self): 41 | global useServo 42 | if useServo: 43 | self.servo.deinit() 44 | else: 45 | self.pwm.deinit() 46 | self._attached = False 47 | 48 | def attached(self): 49 | return self._attached 50 | 51 | def write_us(self, us): 52 | """Set the signal to be ``us`` microseconds long. Zero disables it.""" 53 | global useServo 54 | if useServo: 55 | self.servo.duty(us) 56 | else: 57 | """PWM uses duty as a value from 0-1024""" 58 | duty = int(us / (1000000 / self.freq / 1024)) 59 | self.pwm.duty(duty) 60 | 61 | def write(self, degrees): 62 | """Move to the specified angle in ``degrees``.""" 63 | degrees = degrees % 360 64 | if degrees < 0: 65 | degrees += 360 66 | if degrees > 180: 67 | degrees = 180 68 | total_range = self.max_us - self.min_us 69 | us = self.min_us + total_range * degrees // self.max_ang 70 | self.write_us(us) 71 | 72 | def __deinit__(self): 73 | global useServo 74 | if useServo: 75 | self.servo.deinit() 76 | else: 77 | self.pwm.deinit() 78 | -------------------------------------------------------------------------------- /us.py: -------------------------------------------------------------------------------- 1 | import machine 2 | import utime 3 | from machine import Pin 4 | 5 | __version__ = '0.2.0' 6 | __author__ = 'Roberto S�nchez' 7 | __license__ = "Apache License 2.0. https://www.apache.org/licenses/LICENSE-2.0" 8 | 9 | 10 | class us: 11 | """ 12 | Driver to use the untrasonic sensor HC-SR04. 13 | The sensor range is between 2cm and 4m. 14 | The timeouts received listening to echo pin are converted to OSError('Out of range') 15 | """ 16 | # echo_timeout_us is based in chip range limit (400cm) 17 | def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30): 18 | """ 19 | trigger_pin: Output pin to send pulses 20 | echo_pin: Readonly pin to measure the distance. The pin should be protected with 1k resistor 21 | echo_timeout_us: Timeout in microseconds to listen to echo pin. 22 | By default is based in sensor limit range (4m) 23 | """ 24 | self.echo_timeout_us = echo_timeout_us 25 | # Init trigger pin (out) 26 | self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=-1) 27 | self.trigger.value(0) 28 | 29 | # Init echo pin (in) 30 | self.echo = Pin(echo_pin, mode=Pin.IN, pull=-1) 31 | 32 | def _send_pulse_and_wait(self): 33 | """ 34 | Send the pulse to trigger and listen on echo pin. 35 | We use the method `machine.time_pulse_us()` to get the microseconds until the echo is received. 36 | """ 37 | self.trigger.value(0) # Stabilize the sensor 38 | utime.sleep_us(5) 39 | self.trigger.value(1) 40 | # Send a 10us pulse. 41 | utime.sleep_us(10) 42 | self.trigger.value(0) 43 | try: 44 | pulse_time = machine.time_pulse_us(self.echo, 1, self.echo_timeout_us) 45 | return pulse_time 46 | except OSError as ex: 47 | if ex.args[0] == 110: # 110 = ETIMEDOUT 48 | raise OSError('Out of range') 49 | raise ex 50 | 51 | def distance_mm(self): 52 | """ 53 | Get the distance in milimeters without floating point operations. 54 | """ 55 | pulse_time = self._send_pulse_and_wait() 56 | 57 | if pulse_time < 0: 58 | return 4000 59 | 60 | # To calculate the distance we get the pulse_time and divide it by 2 61 | # (the pulse walk the distance twice) and by 29.1 becasue 62 | # the sound speed on air (343.2 m/s), that It's equivalent to 63 | # 0.34320 mm/us that is 1mm each 2.91us 64 | # pulse_time // 2 // 2.91 -> pulse_time // 5.82 -> pulse_time * 100 // 582 65 | mm = pulse_time * 100 // 582 66 | return round(mm, 2) 67 | 68 | def distance_cm(self): 69 | """ 70 | Get the distance in centimeters with floating point operations. 71 | It returns a float 72 | """ 73 | pulse_time = self._send_pulse_and_wait() 74 | 75 | if pulse_time < 0: 76 | return 400 77 | 78 | # To calculate the distance we get the pulse_time and divide it by 2 79 | # (the pulse walk the distance twice) and by 29.1 because 80 | # the sound speed on air (343.2 m/s), that It's equivalent to 81 | # 0.034320 cm/us that is 1cm each 29.1us 82 | cms = (pulse_time / 2) / 29.1 83 | return round(cms, 2) 84 | -------------------------------------------------------------------------------- /notes.py: -------------------------------------------------------------------------------- 1 | #-- Note constants for otto9 2 | #-- OttDIY Python Project, 2020 3 | 4 | C0 = const(16) #-- 16.35 5 | Db0 = const(17) #-- 17.32 6 | D0 = const(18) #-- 18.35 7 | Eb0 = const(19) #-- 19.45 8 | E0 = const(21) #-- 20.60 9 | F0 = const(22) #-- 21.83 10 | Gb0 = const(23) #-- 23.12 11 | G0 = const(25) #-- 24.50 12 | Ab0 = const(26) #-- 25.96 13 | A0 = const(28) #-- 27.50 14 | Bb0 = const(29) #-- 29.14 15 | B0 = const(31) #-- 30.87 16 | C1 = const(33) #-- 32.70 17 | Db1 = const(35) #-- 34.65 18 | D1 = const(37) #-- 36.71 19 | Eb1 = const(39) #-- 38.89 20 | E1 = const(41) #-- 41.20 21 | F1 = const(44) #-- 43.65 22 | Gb1 = const(46) #-- 46.25 23 | G1 = const(49) #-- 49.00 24 | Ab1 = const(52) #-- 51.91 25 | A1 = const(55) #-- 55.00 26 | Bb1 = const(58) #-- 58.27 27 | B1 = const(62) #-- 61.74 28 | C2 = const(65) #-- 65.41 29 | Db2 = const(69) #-- 69.30 30 | D2 = const(73) #-- 73.42 31 | Eb2 = const(78) #-- 77.78 32 | E2 = const(82) #-- 82.41 33 | F2 = const(87) #-- 87.31 34 | Gb2 = const(93) #-- 92.50 35 | G2 = const(98) #-- 98.00 36 | Ab2 = const(104) #-- 103.83 37 | A2 = const(110) #-- 110.00 38 | Bb2 = const(117) #-- 116.54 39 | B2 = const(123) #-- 123.47 40 | C3 = const(131) #-- 130.81 41 | Db3 = const(139) #-- 138.59 42 | D3 = const(147) #-- 146.83 43 | Eb3 = const(156) #-- 155.56 44 | E3 = const(165) #-- 164.81 45 | F3 = const(175) #-- 174.61 46 | Gb3 = const(185) #-- 185.00 47 | G3 = const(196) #-- 196.00 48 | Ab3 = const(208) #-- 207.65 49 | A3 = const(220) #-- 220.00 50 | Bb3 = const(233) #-- 233.08 51 | B3 = const(247) #-- 246.94 52 | C4 = const(262) #-- 261.63 53 | Db4 = const(277) #-- 277.18 54 | D4 = const(294) #-- 293.66 55 | Eb4 = const(311) #-- 311.13 56 | E4 = const(330) #-- 329.63 57 | F4 = const(349) #-- 349.23 58 | Gb4 = const(370) #-- 369.99 59 | G4 = const(392) #-- 392.00 60 | Ab4 = const(415) #-- 415.30 61 | A4 = const(440) #-- 440.00 62 | Bb4 = const(466) #-- 466.16 63 | B4 = const(494) #-- 493.88 64 | C5 = const(523) #-- 523.25 65 | Db5 = const(554) #-- 554.37 66 | D5 = const(587) #-- 587.33 67 | Eb5 = const(622) #-- 622.25 68 | E5 = const(659) #-- 659.26 69 | F5 = const(698) #-- 698.46 70 | Gb5 = const(740) #-- 739.99 71 | G5 = const(784) #-- 783.99 72 | Ab5 = const(831) #-- 830.61 73 | A5 = const(880) #-- 880.00 74 | Bb5 = const(932) #-- 932.33 75 | B5 = const(988) #-- 987.77 76 | C6 = const(1047) #-- 1046.50 77 | Db6 = const(1109) #-- 1108.73 78 | D6 = const(1175) #-- 1174.66 79 | Eb6 = const(1245) #-- 1244.51 80 | E6 = const(1319) #-- 1318.51 81 | F6 = const(1397) #-- 1396.91 82 | Gb6 = const(1480) #-- 1479.98 83 | G6 = const(1568) #-- 1567.98 84 | Ab6 = const(1661) #-- 1661.22 85 | A6 = const(1760) #-- 1760.00 86 | Bb6 = const(1865) #-- 1864.66 87 | B6 = const(1976) #-- 1975.53 88 | C7 = const(2093) #-- 2093.00 89 | Db7 = const(2217) #-- 2217.46 90 | D7 = const(2349) #-- 2349.32 91 | Eb7 = const(2489) #-- 2489.02 92 | E7 = const(2637) #-- 2637.02 93 | F7 = const(2794) #-- 2793.83 94 | Gb7 = const(2960) #-- 2959.96 95 | G7 = const(3136) #-- 3135.96 96 | Ab7 = const(3322) #-- 3322.44 97 | A7 = const(3520) #-- 3520.00 98 | Bb7 = const(3729) #-- 3729.31 99 | B7 = const(3951) #-- 3951.07 100 | C8 = const(4186) #-- 4186.01 101 | Db8 = const(4435) #-- 4434.92 102 | D8 = const(4699) #-- 4698.64 103 | Eb8 = const(4978) #-- 4978.03 104 | 105 | #end 106 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at . All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /oscillator.py: -------------------------------------------------------------------------------- 1 | #-- MicroPython driver to Generate sinusoidal oscillations in the servos 2 | #-- Oscillator.pde: GPL license (c) Juan Gonzalez-Gomez (Obijuan), 2011 3 | #-- OttoDIY Python Project, 2020 4 | 5 | import math, time, otto_servo 6 | 7 | class Oscillator: 8 | def __init__(self, trim = 0): 9 | # Oscillators parameters 10 | self._A = 0 # Amplitude (degrees) 11 | self._O = 0 # Offset (degrees) 12 | self._T = 0 # Period (miliseconds) 13 | self._phase0 = 0.0 # Phase (radians) 14 | 15 | # Internal variables 16 | self._servo = otto_servo.Servo() # Servo that is attached to the oscillator 17 | self._pos = 0 # Current servo pos 18 | self._trim = trim # Calibration offset 19 | self._phase = 0.0 # Current phase 20 | self._inc = 0.0 # Increment of phase 21 | self._N = 0.0 # Number of samples 22 | self._TS = 0 # sampling period (ms) 23 | self._previousMillis = 0 24 | self._currentMillis = 0 25 | self._stop = True # Oscillation mode. If true, the servo is stopped 26 | self._rev = False # Reverse mode 27 | 28 | #-- Attach an oscillator to a servo 29 | #-- Input: pin is the pin were the servo is connected 30 | def attach(self, pin, rev = False): 31 | if not self._servo.attached(): #-- If the oscillator is detached, 32 | self._servo.attach(pin) #-- Attach the servo and move it to the home position 33 | self._servo.write(90 + self._trim) 34 | 35 | #-- Initialization of oscilaltor parameters 36 | self._TS = 30 37 | self._T = 2000 38 | self._N = self._T / self._TS 39 | self._inc = 2 * math.pi / self._N 40 | self._previousMillis = 0 41 | 42 | #-- Default parameters 43 | self._A = 45 44 | self._phase = 0 45 | self._phase0 = 0 46 | self._O = 0 47 | self._stop = False 48 | 49 | #-- Reverse mode 50 | self._rev = rev 51 | 52 | #-- Detach an oscillator from his servo 53 | def detach(self): 54 | 55 | if self._servo.attached(): #-- If the oscillator is attached, 56 | self._servo.detach() 57 | 58 | #-- Set the oscillator Phase (radians) 59 | def SetA(self, A): 60 | self._A = A 61 | 62 | #-- Set the oscillator Phase (radians) 63 | def SetO(self, O): 64 | self._O = O 65 | 66 | #-- Set the oscillator Phase (radians) 67 | def SetPh(self, Ph): 68 | self._phase0 = Ph 69 | 70 | #-- Set the oscillator period, ms 71 | def SetT(self, T): 72 | self._T = T #-- Assign the period 73 | self._N = self._T / self._TS #-- Recalculate the parameters 74 | self._inc = 2 * math.pi / self._N 75 | 76 | #-- Manual set of the position 77 | def SetPosition(self, position): 78 | self._servo.write(position + self._trim) 79 | 80 | #-- SetTrim 81 | def SetTrim(self, trim): 82 | self._trim = trim 83 | 84 | #-- getTrim 85 | def getTrim(self): 86 | return self._trim 87 | 88 | 89 | #-- Stop 90 | def Stop(self): 91 | self._stop = True 92 | 93 | #-- Play 94 | def Play(self): 95 | self._stop = False 96 | 97 | #-- Reset 98 | def Reset(self): 99 | self._phase = 0 100 | 101 | #-- should be taken (i.e. the TS time has passed since 102 | #-- the last sample was taken 103 | def __next_sample(self): 104 | self._currentMillis = time.ticks_ms() #-- Read current time 105 | if self._currentMillis - self._previousMillis > self._TS: 106 | self._previousMillis = self._currentMillis; 107 | return True 108 | return False 109 | 110 | """ 111 | This function should be periodically called 112 | in order to maintain the oscillations. It calculates 113 | if another sample should be taken and position the servo if so 114 | """ 115 | def refresh(self): 116 | if self.__next_sample(): #-- Only When TS milliseconds have passed, sample is obtained 117 | if not self._stop: #-- If the oscillator is not stopped, the servo position 118 | self._pos = round(self._A * math.sin(self._phase + self._phase0) + self._O) #-- Sample the sine function and set the servo pos 119 | if self._rev: 120 | self._pos = -self._pos 121 | self._servo.write(self._pos + 90 + self._trim) 122 | 123 | #-- Increment the phase 124 | #-- It is always increased, when the oscillator is stop 125 | #-- so that the coordination is always kept 126 | self._phase = self._phase + self._inc 127 | -------------------------------------------------------------------------------- /assets.json: -------------------------------------------------------------------------------- 1 | [ 2 | "remote-control.html", 3 | "moves.html", 4 | "gestures.html", 5 | "songs.html", 6 | "mouths.html", 7 | "lib/picnic/picnic.min.css", 8 | "images/Control/backward@2x.png", 9 | "images/Control/forward@2x.png", 10 | "images/Control/left@2x.png", 11 | "images/Control/right@2x.png", 12 | "images/Buttons/Border/border@2x.png", 13 | "images/Buttons/Help/help@2x.png", 14 | "images/Buttons/Swing/swing@2x.png", 15 | "images/Buttons/Gestures/Sad/sad@2x.png", 16 | "images/Buttons/Gestures/Victory/victory@2x.png", 17 | "images/Buttons/Gestures/Magic/magic@2x.png", 18 | "images/Buttons/Gestures/Happy/happy@2x.png", 19 | "images/Buttons/Gestures/SuperHappy/superhappy@2x.png", 20 | "images/Buttons/Gestures/Fart/fart@2x.png", 21 | "images/Buttons/Gestures/Confused/confused@2x.png", 22 | "images/Buttons/Gestures/Fail/fail@2x.png", 23 | "images/Buttons/Gestures/Sleeping/sleeping@2x.png", 24 | "images/Buttons/Gestures/Love/love@2x.png", 25 | "images/Buttons/Gestures/Fretful/fretful@2x.png", 26 | "images/Buttons/Gestures/Angry/angry@2x.png", 27 | "images/Buttons/Gestures/Wave/wave@2x.png", 28 | "images/Buttons/Bend/bendright@2x.png", 29 | "images/Buttons/Bend/bendleft@2x.png", 30 | "images/Buttons/Flap/flapfront@2x.png", 31 | "images/Buttons/Flap/flapback@2x.png", 32 | "images/Buttons/Ascend/ascend@2x.png", 33 | "images/Buttons/Cross/crossright@2x.png", 34 | "images/Buttons/Humanoid/Help/help@2x.png", 35 | "images/Buttons/Humanoid/Swing/swing@2x.png", 36 | "images/Buttons/Humanoid/Bend/bendright@2x.png", 37 | "images/Buttons/Humanoid/Bend/bendleft@2x.png", 38 | "images/Buttons/Humanoid/Flap/flapfront@2x.png", 39 | "images/Buttons/Humanoid/Flap/flapback@2x.png", 40 | "images/Buttons/Humanoid/Mouth/Sad/sad@2x.png", 41 | "images/Buttons/Humanoid/Mouth/Fretful/fretful@2x.png", 42 | "images/Buttons/Humanoid/Mouth/Victory/victory@2x.png", 43 | "images/Buttons/Humanoid/Mouth/Magic/magic@2x.png", 44 | "images/Buttons/Humanoid/Mouth/Happy/happy@2x.png", 45 | "images/Buttons/Humanoid/Mouth/SuperHappy/superhappy@2x.png", 46 | "images/Buttons/Humanoid/Mouth/Fart/fart@2x.png", 47 | "images/Buttons/Humanoid/Mouth/Confused/confused@2x.png", 48 | "images/Buttons/Humanoid/Mouth/Fail/fail@2x.png", 49 | "images/Buttons/Humanoid/Mouth/Sleeping/sleeping@2x.png", 50 | "images/Buttons/Humanoid/Mouth/Love/love@2x.png", 51 | "images/Buttons/Humanoid/Mouth/Angry/angry@2x.png", 52 | "images/Buttons/Humanoid/Mouth/Wave/wave@2x.png", 53 | "images/Buttons/Humanoid/Cross/crossleft@2x.png", 54 | "images/Buttons/Humanoid/Cross/crossright@2x.png", 55 | "images/Buttons/Humanoid/Face/face@2x.png", 56 | "images/Buttons/Humanoid/Moonwalk/moonwalkleft@2x.png", 57 | "images/Buttons/Humanoid/Moonwalk/moonwalkright@2x.png", 58 | "images/Buttons/Humanoid/Beep/beep@2x.png", 59 | "images/Buttons/Humanoid/Hand/handright@2x.png", 60 | "images/Buttons/Humanoid/Hand/handleft@2x.png", 61 | "images/Buttons/Humanoid/Hand/handsup@2x.png", 62 | "images/Buttons/Humanoid/Updown/updown@2x.png", 63 | "images/Buttons/Humanoid/Shake/shakeright@2x.png", 64 | "images/Buttons/Humanoid/Shake/shakeleft@2x.png", 65 | "images/Buttons/Tiptoe/tiptoe@2x.png", 66 | "images/Buttons/Jitter/jitter@2x.png", 67 | "images/Buttons/Moonwalk/moonwalkleft@2x.png", 68 | "images/Buttons/Moonwalk/moonwalkright@2x.png", 69 | "images/Buttons/Moves/moves@2x.png", 70 | "images/Buttons/Updown/updown@2x.png", 71 | "images/Buttons/Sing/Sad/sad@2x.png", 72 | "images/Buttons/Sing/Disconnection/disconnection@2x.png", 73 | "images/Buttons/Sing/Happy/happy@2x.png", 74 | "images/Buttons/Sing/SuperHappy/superHappy@2x.png", 75 | "images/Buttons/Sing/Fart/fart1@2x.png", 76 | "images/Buttons/Sing/Fart/fart2@2x.png", 77 | "images/Buttons/Sing/Fart/fart3@2x.png", 78 | "images/Buttons/Sing/Confused/confused@2x.png", 79 | "images/Buttons/Sing/Mode/mode2@2x.png", 80 | "images/Buttons/Sing/Mode/mode3@2x.png", 81 | "images/Buttons/Sing/Mode/mode1@2x.png", 82 | "images/Buttons/Sing/Cuddly/cuddly@2x.png", 83 | "images/Buttons/Sing/Sleeping/sleeping@2x.png", 84 | "images/Buttons/Sing/Button/buttonPushed@2x.png", 85 | "images/Buttons/Sing/Beeps/beep@2x.png", 86 | "images/Buttons/Sing/Surprise/surprise@2x.png", 87 | "images/Buttons/Sing/OhOoh/OhOoh2@2x.png", 88 | "images/Buttons/Sing/OhOoh/OhOoh@2x.png", 89 | "images/Buttons/Sing/Happy_short/happy_short@2x.png" 90 | ] -------------------------------------------------------------------------------- /mouths.py: -------------------------------------------------------------------------------- 1 | #-- Mouths sorted by numbers, and after, by happy to sad mouths 2 | #-- OttDIY Python Project, 2020 3 | 4 | ZERO = const(0) 5 | ONE = const(1) 6 | TWO = const(2) 7 | THREE = const(3) 8 | FOUR = const(4) 9 | FIVE = const(5) 10 | SIX = const(6) 11 | SEVEN = const(7) 12 | EIGHT = const(8) 13 | NINE = const(9) 14 | SMILE = const(10) 15 | HAPPYOPEN = const(11) 16 | HAPPYCLOSED = const(12) 17 | HEART = const(13) 18 | BIGSURPRISE = const(14) 19 | SMALLSURPRISE = const(15) 20 | TONGUEOUT = const(16) 21 | VAMP1 = const(17) 22 | VAMP2 = const(18) 23 | LINEMOUTH = const(19) 24 | CONFUSED = const(20) 25 | DIAGONAL = const(21) 26 | SAD = const(22) 27 | SADOPEN = const(23) 28 | SADCLOSED = const(24) 29 | OKMOUTH = const(25) 30 | XMOUTH = const(26) 31 | INTERROGATION = const(27) 32 | THUNDER = const(28) 33 | CULITO = const(29) 34 | ANGRY = const(30) 35 | 36 | mouths = [ 37 | 0b00001100010010010010010010001100, # zero_code 38 | 0b00000100001100000100000100001110, # one_code 39 | 0b00001100010010000100001000011110, # two_code 40 | 0b00001100010010000100010010001100, # three_code 41 | 0b00010010010010011110000010000010, # four_code 42 | 0b00011110010000011100000010011100, # five_code 43 | 0b00000100001000011100010010001100, # six_code 44 | 0b00011110000010000100001000010000, # seven_code 45 | 0b00001100010010001100010010001100, # eight_code 46 | 0b00001100010010001110000010001110, # nine_code 47 | 0b00000000100001010010001100000000, # smile_code 48 | 0b00000000111111010010001100000000, # happyOpen_code 49 | 0b00000000111111011110000000000000, # happyClosed_code 50 | 0b00010010101101100001010010001100, # heart_code 51 | 0b00001100010010100001010010001100, # bigSurprise_code 52 | 0b00000000000000001100001100000000, # smallSurprise_code 53 | 0b00111111001001001001000110000000, # tongueOut_code 54 | 0b00111111101101101101010010000000, # vamp1_code 55 | 0b00111111101101010010000000000000, # vamp2_code 56 | 0b00000000000000111111000000000000, # lineMouth_code 57 | 0b00000000001000010101100010000000, # confused_code 58 | 0b00100000010000001000000100000010, # diagonal_code 59 | 0b00000000001100010010100001000000, # sad_code 60 | 0b00000000001100010010111111000000, # sadOpen_code 61 | 0b00000000001100011110110011000000, # sadClosed_code 62 | 0b00000001000010010100001000000000, # okMouth_code 63 | 0b00100001010010001100010010100001, # xMouth_code 64 | 0b00001100010010000100000100000100, # interrogation_code 65 | 0b00000100001000011100001000010000, # thunder_code 66 | 0b00000000100001101101010010000000, # culito_code 67 | 0b00000000011110100001100001000000 # angry_code 68 | ] 69 | 70 | # -- mouth animations 71 | 72 | LITTLEUUH = const(0) 73 | DREAMMOUTH = const(1) 74 | ADIVINAWI = const(2) 75 | WAVE = const(3) 76 | 77 | aniMouths = [ 78 | [ 79 | 0b00000000000000001100001100000000, 80 | 0b00000000000000000110000110000000, 81 | 0b00000000000000000011000011000000, 82 | 0b00000000000000000110000110000000, 83 | 0b00000000000000001100001100000000, 84 | 0b00000000000000011000011000000000, 85 | 0b00000000000000110000110000000000, 86 | 0b00000000000000011000011000000000 87 | ], 88 | [ 89 | 0b00000000000000000000110000110000, 90 | 0b00000000000000010000101000010000, 91 | 0b00000000011000100100100100011000, 92 | 0b00000000000000010000101000010000 93 | ], 94 | [ 95 | 0b00100001000000000000000000100001, 96 | 0b00010010100001000000100001010010, 97 | 0b00001100010010100001010010001100, 98 | 0b00000000001100010010001100000000, 99 | 0b00000000000000001100000000000000, 100 | 0b00000000000000000000000000000000 101 | ], 102 | [ 103 | 0b00001100010010100001000000000000, 104 | 0b00000110001001010000100000000000, 105 | 0b00000011000100001000010000100000, 106 | 0b00000001000010000100001000110000, 107 | 0b00000000000001000010100100011000, 108 | 0b00000000000000100001010010001100, 109 | 0b00000000100000010000001001000110, 110 | 0b00100000010000001000000100000011, 111 | 0b00110000001000000100000010000001, 112 | 0b00011000100100000010000001000000 113 | ] 114 | ] 115 | -------------------------------------------------------------------------------- /web/mouths.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Mouths 6 | 7 | 8 | 13 | 54 | 55 | 56 |
57 |
58 |
59 |
60 | Happy 61 |
62 |
63 | Super Happy 64 |
65 |
66 | Love 67 |
68 |
69 | Sad 70 |
71 |
72 | Fail 73 |
74 |
75 |
76 |

77 |
78 |
79 |
80 | Confused 81 |
82 |
83 | Fart 84 |
85 |
86 | Fretful 87 |
88 |
89 | Angry 90 |
91 |
92 | Sleeping 93 |
94 |
95 |
96 |

97 |
98 |
99 |
100 | Magic 101 |
102 |
103 | Victory 104 |
105 |
106 | Wave 107 |
108 |
109 |
110 |
111 | 112 | 113 | -------------------------------------------------------------------------------- /web/gestures.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Gestures 6 | 7 | 8 | 29 | 70 | 71 | 72 | 73 |
74 |
75 |
76 |
77 | Happy 78 |
79 |
80 | Super Happy 81 |
82 |
83 | Love 84 |
85 |
86 | Sad 87 |
88 |
89 | Fail 90 |
91 |
92 |
93 |

94 |
95 |
96 |
97 | Confused 98 |
99 |
100 | Fart 101 |
102 |
103 | Fretful 104 |
105 |
106 | Angry 107 |
108 |
109 | Sleeping 110 |
111 |
112 |
113 |

114 |
115 |
116 |
117 | Magic 118 |
119 |
120 | Victory 121 |
122 |
123 | Wave 124 |
125 |
126 |
127 |
128 | 129 | -------------------------------------------------------------------------------- /web/songs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Songs 6 | 7 | 8 | 34 | 75 | 76 | 77 |
78 |
79 |
80 |
81 | Mode 1 82 |
83 |
84 | Mode 2 85 |
86 |
87 | Mode 2 88 |
89 |
90 | OhOoh2 91 |
92 |
93 | Button Pushed 94 |
95 |
96 |
97 |

98 |
99 |
100 |
101 | Happy Short 102 |
103 |
104 | Happy 105 |
106 |
107 | Super Happy 108 |
109 |
110 | Sad 111 |
112 |
113 | Sleeping 114 |
115 |
116 |
117 |

118 |
119 |
120 |
121 | Surprise 122 |
123 |
124 | Disconnection 125 |
126 |
127 | Confused 128 |
129 |
130 | Fart 3 131 |
132 |
133 | Cuddly 134 |
135 |
136 |
137 |
138 | 139 | -------------------------------------------------------------------------------- /web/moves.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Moves 6 | 7 | 8 | 39 | 80 | 81 | 82 |
83 |
84 |
85 |
86 | Hand Wave Right 87 |
88 |
89 | Hand Wave Left 90 |
91 |
92 | Hands Up 93 |
94 |
95 | Swing 96 |
97 |
98 | Up/Down 99 |
100 |
101 |
102 |

103 |
104 |
105 |
106 | Flap Front 107 |
108 |
109 | Moonwalk Left 110 |
111 |
112 | Bend Left 113 |
114 |
115 | Shake Left Leg 116 |
117 |
118 | Cross Left 119 |
120 |
121 |
122 |

123 |
124 |
125 |
126 | Flap Back 127 |
128 |
129 | Moonwalk Right 130 |
131 |
132 | Bend Right 133 |
134 |
135 | Shake Right Leg 136 |
137 |
138 | Cross Right 139 |
140 |
141 |
142 |
143 | 144 | -------------------------------------------------------------------------------- /otto_matrix.py: -------------------------------------------------------------------------------- 1 | #-- OttDIY Python Project, 2020 2 | 3 | from machine import Pin, SPI 4 | import otto_font, time 5 | 6 | DECODEMODE = const(0x09) 7 | INTENSITY = const(0x0a) 8 | SCANLIMIT = const(0x0b) 9 | SHUTDOWN = const(0x0c) 10 | DISPLAYTEST = const(0x0f) 11 | 12 | class OttoMatrix: 13 | #-- initialize an LED matrix with all the pins 14 | #-- Parameters: 15 | #-- data: pin to use for data 16 | #-- cs: pin to use for chip select low = selected 17 | #-- clock: pin to use as clock 18 | #-- num: number of leds in chain 19 | #-- rotation: 1-4 rotation of LED 20 | def __init__(self, data = 5, cs = 18, clock = 19, num = 1, rotation = 1): 21 | self.spi = SPI(2, baudrate = 125000, polarity = 0, phase = 0, firstbit = SPI.MSB, sck = Pin(clock), mosi = Pin(data)) 22 | self.cs = Pin(cs, Pin.OUT) 23 | self.cs.value(1) #start with the select high 24 | self.num = num 25 | if rotation > 4 or rotation <= 0: 26 | rotation = 1 27 | self.rotation = rotation 28 | self.buffer = bytearray(8 * self.num) 29 | self.charBuffer = bytearray(160) 30 | 31 | self.setCommand(SCANLIMIT, 0x07) 32 | self.setCommand(DECODEMODE, 0x00) 33 | self.setCommand(SHUTDOWN, 0x01) 34 | self.setCommand(DISPLAYTEST, 0x00) 35 | 36 | self.clearMatrix() 37 | self.setIntensity(0x0f) 38 | 39 | def deinit(self): 40 | # print("OttoMatrix del called") 41 | self.spi.deinit() 42 | del(self.spi) 43 | 44 | #-- Set the intensity of the LED matrix 45 | #-- Parameters: 46 | #-- intensity: how bright the LEDs are 47 | def setIntensity(self, intensity): 48 | self.setCommand(INTENSITY, intensity) 49 | 50 | #-- Clear all the leds and the buffers 51 | def clearMatrix(self): 52 | for i in range(len(self.buffer)): 53 | self.setColumnAll(i, 0) 54 | self.buffer[i] = 0 55 | 56 | for i in range(len(self.charBuffer)): 57 | self.charBuffer[i] = 0 58 | 59 | #-- Send a command to the LED matrix 60 | #-- Parameters: 61 | #-- command: command number 62 | #-- value: command value 63 | def setCommand(self, command, value): 64 | buf = bytearray(2) 65 | buf[0] = command 66 | buf[1] = value 67 | # we must first set the CS low 68 | self.cs.value(0) 69 | for i in range(self.num): 70 | self.spi.write(buf) 71 | #we must set the CS HIGH 72 | self.cs.value(1) 73 | 74 | #-- Set a column to a value 75 | #-- Parmeters: 76 | #-- col: which column 77 | #-- value: value to set 78 | def setColumn(self, col, value): 79 | n = col // 8 80 | c = col % 8 81 | buf = bytearray(2) 82 | buf[0] = c + 1 83 | buf[1] = value 84 | self.buffer[col] = value 85 | 86 | # we must first set the CS low 87 | self.cs.value(0) 88 | for i in range(self.num): 89 | if i == n: 90 | self.spi.write(buf) 91 | else: 92 | self.spi.write(b'\x00\x00') 93 | 94 | #we must set the CS HIGH 95 | self.cs.value(1) 96 | 97 | 98 | 99 | #-- Set all Led matrixes column to a value 100 | #-- Parmeters: 101 | #-- col: which column 102 | #-- value: value to set 103 | def setColumnAll(self, col, value): 104 | buf = bytearray(2) 105 | buf[0] = col + 1 106 | buf[1] = value 107 | 108 | # we must first set the CS low 109 | self.cs.value(0) 110 | for i in range(self.num): 111 | self.spi.write(buf) 112 | self.buffer[col * i] = value 113 | #we must set the CS HIGH 114 | self.cs.value(1) 115 | 116 | #-- Set a dot 117 | #-- Parmeters: 118 | #-- col: which column 119 | #-- row: which row 120 | #-- value: value to set 121 | def setDot(self, col, row, value): 122 | if value == 0: 123 | self.buffer[col] = self.buffer[col] & ~(1 << row) 124 | else: 125 | self.buffer[col] = self.buffer[col] | (1 << row) 126 | 127 | n = col // 8 128 | c = col % 8 129 | buf = bytearray(2) 130 | buf[0] = c + 1 131 | buf[1] = self.buffer[col] 132 | 133 | # we must first set the CS low 134 | self.cs.value(0) 135 | for i in range(self.num): 136 | if i == n: 137 | self.spi.write(buf) 138 | else: 139 | self.spi.write(b'\x00\x00') 140 | 141 | #we must set the CS HIGH 142 | self.cs.value(1) 143 | 144 | #-- take a 30 bit value and write it to a 6x5 array 145 | #-- Parmeters: 146 | #-- value: 30 bits if led on/off info 147 | def writeFull(self, value): 148 | for r in range(5): 149 | for c in range(6): 150 | bit = 1 & (value >> (r * 6 + c)) 151 | if self.rotation == 1: 152 | self.setDot(6 - c, 7 - r, bit) 153 | if self.rotation == 2: 154 | self.setDot(1 + c, r, bit) 155 | if self.rotation == 3: 156 | self.setDot(r, 6 - c, bit) 157 | if self.rotation == 4: 158 | self.setDot(7 - r, 6 - c, bit) 159 | 160 | #-- display a character on the LED matrix 161 | #-- Parameters: 162 | #-- data: character to display 163 | #-- pos: position to display it at 164 | #-- number: total number of characters we are displaying 165 | #-- scrollspeed: how fast to scroll text 166 | def sendChar(self, data, pos, number, scrollspeed): 167 | if scrollspeed < 50: 168 | scrollspeed = 50 169 | if scrollspeed > 150: 170 | scrollspeed = 150 171 | charPos = pos * 8 172 | try: 173 | ch = otto_font.font_6x8[data] 174 | except: 175 | ch = otto_font.font_6x8['+'] 176 | 177 | self.charBuffer[0 + charPos] = 0 178 | self.charBuffer[1 + charPos: 6 + charPos] = ch 179 | self.charBuffer[7 + charPos] = 0 180 | 181 | #-- this is the last character so display them 182 | if number == (pos + 1): 183 | for c in range(8): 184 | value = self.charBuffer[c] 185 | for r in range(8): 186 | bit = 1 & (value >> r) 187 | if self.rotation == 1: 188 | self.setDot(c, 7 - r, bit) 189 | if self.rotation == 2: 190 | self.setDot(7 - c, r, bit) 191 | if self.rotation == 3: 192 | self.setDot(r, c, bit) 193 | if self.rotation == 4: 194 | self.setDot(7 - r, 7 - c, bit) 195 | 196 | #-- show the first character for longer 197 | time.sleep_ms(500) 198 | 199 | for i in range((number * 8) - 1): 200 | self.charBuffer[i] = self.charBuffer[i + 1] 201 | for c in range(8): 202 | bv = self.charBuffer[c + 1 + i] 203 | for r in range(8): 204 | bit = 1 & (bv >> r) 205 | if self.rotation == 1: 206 | self.setDot(c, 7 - r, bit) 207 | if self.rotation == 2: 208 | self.setDot(7 - c, r, bit) 209 | if self.rotation == 3: 210 | self.setDot(r, c, bit) 211 | if self.rotation == 4: 212 | self.setDot(7 - r, 7 - c, bit) 213 | time.sleep_ms(scrollspeed) 214 | 215 | self.clearMatrix() 216 | -------------------------------------------------------------------------------- /otto_remote.py: -------------------------------------------------------------------------------- 1 | import otto9 2 | import mouths 3 | 4 | import binascii 5 | import hashlib 6 | from micropython import const 7 | 8 | import socket 9 | import sys 10 | import network 11 | #import websocket_helper 12 | import websocket 13 | import ujson 14 | 15 | try: 16 | from esp32 import RFCOMM 17 | except ImportError: 18 | hasRfcomm = False 19 | # print("This version of micropython esp32 doesn't support RFCOMM") 20 | # raise ImportError 21 | 22 | from machine import Timer 23 | import utime 24 | 25 | # we may need this 26 | DEBUG = 0 27 | 28 | class ottoRemote(otto9.Otto9): 29 | def __init__(self, name="Otto", prgId="Otto_V9", webPort=8181): 30 | super().__init__() 31 | self.timer = Timer(0) 32 | self.pending = False 33 | self.cmdList = [] 34 | self.savedCmd = None 35 | self.name = name 36 | self.rfComm = None 37 | if hasRfcomm: 38 | self.rfComm = RFCOMM(device=self.name, server="ESP32") 39 | self.rfComm.callback(RFCOMM.CBTYPE_PATTERN, self.rfRemoteCommand, pattern='\r') 40 | self.cmdDebug = False 41 | self.printCmd = False 42 | self.moveDebug = False 43 | self.prgId = prgId 44 | 45 | self.listenSock = None 46 | self.clientSock = None 47 | self.webSock = None 48 | self.webPort = webPort 49 | 50 | self.ottoMoves = [ 51 | super().home, 52 | (super().walk, 1, 1), 53 | (super().walk, 1, -1), 54 | (super().turn, 1, 1), 55 | (super().turn, 1, -1), 56 | (super().updown, 1, 0), 57 | (super().moonwalker, 1, 0, 1), 58 | (super().moonwalker, 1, 0, -1), 59 | (super().swing, 1, 0), 60 | (super().crusaito, 1, 0, 1), 61 | (super().crusaito, 1, 0, -1), 62 | (super().jump, 1), 63 | (super().flapping, 1, 0, 1), 64 | (super().flapping, 1, 0, -1), 65 | (super().tiptoeSwing, 1, 0), 66 | (super().bend, 1, 1), 67 | (super().bend, 1, -1), 68 | (super().shakeLeg, 1, 1), 69 | (super().shakeLeg, 1, -1), 70 | (super().jitter, 1, 0), 71 | (super().ascendingTurn, 1, 0), 72 | super().handsup, 73 | (super().handwave, 1, -2), 74 | (super().handwave, -1, -2) 75 | ] 76 | 77 | self.setupConn() 78 | 79 | def deinit(self): 80 | if self.rfComm: 81 | # we need to deinit rfComm 82 | self.rfComm.deinit() 83 | super().deinit() 84 | 85 | def cmdProc(self, _): 86 | self.pending = False 87 | 88 | if len(self.cmdList) > 0: 89 | # make otto move 90 | cmd = self.cmdList.pop(0) 91 | elif self.savedCmd is not None: 92 | cmd = self.savedCmd 93 | else: 94 | return 95 | 96 | # make sure command is in dict 97 | if 'command' in cmd: 98 | command = cmd['command'] 99 | else: 100 | return 101 | 102 | self.savedCmd = None 103 | 104 | if command[0] == 'M': 105 | self.sendAck(cmd) 106 | # 'M' is for move 107 | moveIndex = int(command[1]) 108 | 109 | if len(command) > 2: 110 | moveTime = int(command[2]) 111 | else: 112 | moveTime = 1000 113 | 114 | if len(command) > 3: 115 | moveSize = int(command[3]) 116 | else: 117 | moveSize = 15 118 | 119 | if self.moveDebug: 120 | print("index = " + str(moveIndex) + " T = " + str(moveTime) + " moveSize = " + str(moveSize)) 121 | 122 | if len(self.ottoMoves) > moveIndex: 123 | # this should use the otto.getRestState() 124 | if moveIndex != 0: 125 | self.savedCmd = cmd 126 | 127 | # get the actual move 128 | actualMove = self.ottoMoves[moveIndex] 129 | 130 | if isinstance(actualMove, tuple): 131 | # get the specific move 132 | ottoMove = actualMove[0] 133 | if len(actualMove) == 2: 134 | self.cmdPrint(ottoMove.__name__ + "(" + str(actualMove[1]) + ", " + str(moveTime) + ")") 135 | ottoMove(actualMove[1], moveTime) 136 | elif len(actualMove) == 3: 137 | if actualMove[2] == 0: 138 | self.cmdPrint(ottoMove.__name__ + "(" + str(actualMove[1]) + ", " + 139 | str(moveTime) + ", " + str(moveSize) + ")") 140 | ottoMove(actualMove[1], moveTime, moveSize) 141 | elif actualMove[2] >= -1: 142 | self.cmdPrint(ottoMove.__name__ + "(" + str(actualMove[1]) + ", " + 143 | str(moveTime) + ", " + str(actualMove[2]) + ")") 144 | ottoMove(actualMove[1], moveTime, actualMove[2]) 145 | elif actualMove[2] < -1: 146 | self.cmdPrint(ottoMove.__name__ + "(" + str(actualMove[1]) + ")") 147 | ottoMove(actualMove[1]) 148 | else: 149 | self.savedCmd = None 150 | elif len(actualMove) == 4: 151 | self.cmdPrint(ottoMove.__name__ + "(" + str(actualMove[1]) + ", " + str(moveTime) + 152 | ", " + str(moveSize) + ", " + str(actualMove[3]) + ")") 153 | ottoMove(actualMove[1], moveTime, moveSize, actualMove[3]) 154 | else: 155 | self.savedCmd = None 156 | else: 157 | ottoMove = actualMove 158 | self.cmdPrint(ottoMove.__name__ + "()") 159 | ottoMove() 160 | 161 | self.sendFinalAck(cmd) 162 | elif command[0] == 'B': 163 | # 'B' is for request battery 164 | self.cmdPrint("Otto request battery") 165 | batteryLevel = super().getBatteryLevel() 166 | 167 | self.sendResp(cmd, str(batteryLevel)) 168 | elif command[0] == 'D': 169 | # 'D' is for request distance 170 | self.cmdPrint("Otto request distance") 171 | distance = super().getDistance() 172 | 173 | self.sendResp(cmd, str(distance)) 174 | elif command[0] == 'H': 175 | self.sendAck(cmd) 176 | # 'H' is for gesture 177 | gesture = int(command[1]) - 1 178 | self.cmdPrint("Otto gesture=" + str(gesture)) 179 | super().playGesture(gesture) 180 | self.sendFinalAck(cmd) 181 | elif command[0] == 'I': 182 | # 'I' is for request program ID 183 | print("Otto request program ID") 184 | self.sendResp(cmd, self.prgId) 185 | elif command[0] == 'K': 186 | self.sendAck(cmd) 187 | # 'K' is for sing 188 | song = int(command[1]) - 1 189 | self.cmdPrint("Otto sing=" + str(song)) 190 | super().sing(song) 191 | self.sendFinalAck(cmd) 192 | elif command[0] == 'L': 193 | self.sendAck(cmd) 194 | # 'L' is for mouth 195 | mouth = int(command[1], 2) 196 | self.cmdPrint("Otto mouth=" + hex(mouth)) 197 | super().putMouth(mouth, False) 198 | self.sendFinalAck(cmd) 199 | elif command[0] == 'N': 200 | # 'N' is for request noise 201 | print("Otto request noise") 202 | noise = super().getNoise() 203 | 204 | self.sendResp(cmd, str(noise)) 205 | elif command[0] == 'T': 206 | self.sendAck(cmd) 207 | # 'T' is for buzzer 208 | 209 | if len(command) < 3: 210 | # this is an error 211 | super().putMouth(mouths.XMOUTH) 212 | utime.sleep_ms(2000) 213 | super().clearMouth() 214 | else: 215 | self.cmdPrint("Otto buzzer freq=" + command[1] + " time=" + command[2]) 216 | super()._tone(int(command[1]), int(command[2]), 1) 217 | self.sendFinalAck(cmd) 218 | else: 219 | self.sendAck(cmd) 220 | super().home() 221 | self.sendFinalAck(cmd) 222 | 223 | # schedule again if the savedCmd is valid 224 | if self.savedCmd is not None: 225 | self.pending = True 226 | self.timer.init(period=100, mode=Timer.ONE_SHOT, callback=self.cmdProc) 227 | 228 | def addCmd(self, cmd): 229 | self.cmdList.append(cmd) 230 | if not self.pending: 231 | self.cmdProc(self.timer) 232 | 233 | def sendAck(self, cmd): 234 | utime.sleep_ms(30) 235 | if cmd['src'] == 'RFCOMM' and self.rfComm: 236 | if self.rfComm.connected()[cmd['ch']] != 0: 237 | self.rfComm.write(cmd['ch'], "&&A%%\r") 238 | elif cmd['src'] == 'WS': 239 | response = { 240 | 'type': 'ottoAck', 241 | 'command': cmd['command'][0] 242 | } 243 | 244 | cmd['sock'].write(ujson.dumps(response) + '\n') 245 | 246 | def sendFinalAck(self, cmd): 247 | utime.sleep_ms(30) 248 | if cmd['src'] == 'RFCOMM' and self.rfComm: 249 | if self.rfComm.connected()[cmd['ch']] != 0: 250 | self.rfComm.write(cmd['ch'], "&&F%%\r") 251 | elif cmd['src'] == 'WS': 252 | response = { 253 | 'type': 'ottoFinalAck', 254 | 'command': cmd['command'][0] 255 | } 256 | 257 | cmd['sock'].write(ujson.dumps(response) + '\n') 258 | 259 | def sendResp(self, cmd, result): 260 | if cmd['src'] == 'RFCOMM' and self.rfComm: 261 | if self.rfComm.connected()[cmd['ch']] != 0: 262 | self.rfComm.write(cmd['ch'], '&&' + cmd['command'][0] + ' ' + result + '%%\r') 263 | elif cmd['src'] == 'WS': 264 | response = { 265 | 'type': 'ottoResponse', 266 | 'command': cmd['command'][0], 267 | 'result': result 268 | } 269 | 270 | cmd['sock'].write(ujson.dumps(response) + '\n') 271 | 272 | def rfRemoteCommand(self, ev): 273 | cmd = { 274 | 'src': 'RFCOMM', 275 | 'ch': ev[0], 276 | 'command': ev[2].decode().split() 277 | } 278 | if self.cmdDebug: 279 | print(cmd) 280 | self.addCmd(cmd) 281 | 282 | def cmdDbg(self, yesNo): 283 | self.cmdDebug = yesNo 284 | 285 | def moveDbg(self, yesNo): 286 | self.moveDebug = yesNo 287 | 288 | def cmdPrt(self, yesNo): 289 | self.printCmd = yesNo 290 | 291 | def cmdPrint(self, cmdStr): 292 | if self.printCmd: 293 | print(cmdStr) 294 | 295 | def wsRemoteCommand(self, clientSock): 296 | if clientSock == self.clientSock: 297 | try: 298 | strg = self.webSock.readline() 299 | except: 300 | # close the socket 301 | strg = "" 302 | 303 | if len(strg) == 0: 304 | # the connection is gone 305 | self.webSock.close() 306 | self.clientSock.close() 307 | self.webSock = None 308 | self.clientSock = None 309 | return 310 | 311 | try: 312 | cmd = ujson.loads(strg) 313 | cmd['src'] = "WS" 314 | cmd['sock'] = self.webSock 315 | 316 | if self.cmdDebug: 317 | print(cmd) 318 | self.addCmd(cmd) 319 | except: 320 | pass 321 | 322 | def server_handshake(self): 323 | req = self.clientSock.makefile("rwb", 0) 324 | # Skip HTTP GET line. 325 | l = req.readline() 326 | if DEBUG: 327 | sys.stdout.write(repr(l)) 328 | 329 | webkey = None 330 | upgrade = False 331 | websocket = False 332 | 333 | while True: 334 | l = req.readline() 335 | if not l: 336 | # EOF in headers. 337 | return False 338 | if l == b"\r\n": 339 | break 340 | if DEBUG: 341 | sys.stdout.write(l) 342 | h, v = [x.strip() for x in l.split(b":", 1)] 343 | if DEBUG: 344 | print((h, v)) 345 | if h == b"Sec-WebSocket-Key": 346 | webkey = v 347 | elif h == b"Connection" and b"Upgrade" in v: 348 | upgrade = True 349 | elif h == b"Upgrade" and v == b"websocket": 350 | websocket = True 351 | 352 | if not (upgrade and websocket and webkey): 353 | return False 354 | 355 | if DEBUG: 356 | print("Sec-WebSocket-Key:", webkey, len(webkey)) 357 | 358 | d = hashlib.sha1(webkey) 359 | d.update(b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11") 360 | respkey = d.digest() 361 | respkey = binascii.b2a_base64(respkey)[:-1] 362 | if DEBUG: 363 | print("respkey:", respkey) 364 | 365 | self.clientSock.send( 366 | b"""\ 367 | HTTP/1.1 101 Switching Protocols\r 368 | Upgrade: websocket\r 369 | Connection: Upgrade\r 370 | Sec-WebSocket-Accept: """ 371 | ) 372 | self.clientSock.send(respkey) 373 | self.clientSock.send("\r\n\r\n") 374 | return True 375 | 376 | def send_html(self): 377 | self.clientSock.send( 378 | b"""\ 379 | HTTP/1.0 400 Bad Request\r 380 | \r 381 | """ 382 | ) 383 | self.clientSock.close() 384 | self.clientSock = None 385 | 386 | def acceptConn(self, listenSock): 387 | if self.listenSock != listenSock: 388 | self.listenSock = listenSock 389 | 390 | cl, remote_addr = self.listenSock.accept() 391 | print("\nOtto WS connection from:", remote_addr) 392 | 393 | if self.clientSock is not None: 394 | try: 395 | if self.webSock is not None: 396 | self.webSock.close() 397 | self.clientSock.close() 398 | except: 399 | pass 400 | self.webSock = None 401 | self.clientSock = None 402 | 403 | self.clientSock = cl 404 | if not self.server_handshake(): 405 | self.send_html() 406 | return False 407 | self.webSock = websocket.websocket(self.clientSock, True) 408 | self.clientSock.setblocking(False) 409 | self.clientSock.setsockopt(socket.SOL_SOCKET, 20, self.wsRemoteCommand) 410 | 411 | def setupConn(self): 412 | if self.listenSock is not None: 413 | self.listenSock.close() 414 | self.listenSock = None 415 | 416 | self.listenSock = socket.socket() 417 | self.listenSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 418 | 419 | ai = socket.getaddrinfo("0.0.0.0", self.webPort) 420 | addr = ai[0][4] 421 | 422 | self.listenSock.bind(addr) 423 | self.listenSock.listen(1) 424 | self.listenSock.setsockopt(socket.SOL_SOCKET, 20, self.acceptConn) 425 | for i in (network.AP_IF, network.STA_IF): 426 | iface = network.WLAN(i) 427 | if iface.active(): 428 | print("Otto WS daemon started on ws://%s:%d" % (iface.ifconfig()[0], self.webPort)) 429 | 430 | -------------------------------------------------------------------------------- /web/remote-control.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Otto WS control 6 | 7 | 8 | 248 | 249 | 361 | 362 | 363 |

Otto remote control

364 |
365 |
366 | Conn 367 |
368 |
369 |
370 |
??
371 |
372 |
373 |
374 |
375 |
376 |
380 | 381 |
382 | 383 | 384 |
385 |
386 |
387 |
388 |
389 |
390 | Forward 391 |
392 |
393 |
394 |
395 | Left 396 |
397 |
398 | Right 399 |
400 |
401 |
402 |
403 | Backward 404 |
405 |
406 |
407 |
408 | 409 | 410 | 411 |
412 |
413 |
414 | 419 | 424 | 429 | 434 |
435 |
436 |
437 | 438 |
439 |
output
440 |
441 | 442 | 443 | --------------------------------------------------------------------------------