GithubHelp home page GithubHelp logo

ottodiy / ottodiylib Goto Github PK

View Code? Open in Web Editor NEW
106.0 12.0 73.0 6.52 MB

Latest and official Libraries for Arduino Otto DIY robots

Home Page: http://www..ottodiy.com/

License: GNU General Public License v3.0

C++ 90.32% C 9.68%
arduino-libraries otto-remixes ottodiy otto ottodiy-robot-api ottobuilder arduino arduino-library

ottodiylib's Introduction

Otto DIY Robot Arduino Libraries

License: GPL v3 version

This repository have all the main Otto DIY robot libraries for Arduino compatible boards

⭐ Star us on GitHub, it helps!

Installation:

  1. Download the .zip Otto libraries here
  2. Open Arduino IDE and navigate to Sketch > Include Library > Add .ZIP Library. At the top of the drop down list, select the option to "Add .ZIP Library".
  3. Navigate to the .zip file's location, that you just downloaded and open it.
  4. In the main window you will see in the bottom back area a message that it has been installed.
  5. To verify they are properly installed, go to Sketch > Include Library menu. You should now see the library at the bottom of the drop-down menu.

That means it is ready to use Otto example codes! you can find them in File > Examples > OttoDIYLib for more details or other ways to install libraries visit this link

You can also find this library in the Arduino Manager as Otto DIYLib for quick installation, (do not use other non compatible libraries).

Compatible Hardware

  • Arduino Nano
  • Arduino Uno
  • Arduino Micro
  • Arduino Mega
  • Arduino Mini
  • Arduino Leonardo
  • Arduino Nano Every
  • ESP8266
  • ESP32

Structure

Base set of libraries for any biped robot that uses 4 motors in the legs as Otto.

  • Otto.h and Otto.cpp contains all the main functions
  • Otto_gestures.h contains all the gestures functions
  • Otto_mouths.h contains all the mouth functions
  • Otto_sounds.h contains all the sound functions
  • Otto_matrix.h contains all the matrix functions
  • Oscillator.h is the main algorithm for the servos "smooth" movement
  • SerialCommand.c is for Bluetooth communication vis Software serial

Adding library

#include <Otto.h>
Otto Otto;

Pins declaration

These are the default signal connections for the servos and buzzer for AVR Arduino boards in the examples, you can alternatively connect them in different pins if you also change the pin number.

#define LeftLeg 2 // left leg pin
#define RightLeg 3 // right leg pin
#define LeftFoot 4 // left foot pin
#define RightFoot 5 // right foot pin
#define Buzzer 13 //buzzer pin

Initialization

When starting the program, the 'init' function must be called with the use of servo motor calibration as a parameter.
It is best to place the servo motors in their home position after initialization with 'home' function.

void setup() {
   Otto.init(LeftLeg, RightLeg, LeftFoot, RightFoot, true, Buzzer);
   Otto.home();
}

The home() function makes the servos move to the center position, Otto standing in the neutral position.

Predetermined Functions:

Many preconfigured movements are available in the library:

Movements:

These are actions that involve the use of the 4 servo motors with the oscillation library combined in synergy and with smooth movements. You can change the values inside the pratensis () to alter the speed, direction, and size of the movements.

Walk function

Otto.walk(steps, time, dir);
  • steps are just how many times you want to repeat that movement without the need of further coding or adding additional rows.
  • time (noted as T below) translated in milliseconds is the duration of the movement. For a higher time value is slower the movement, try values between 500 to 3000.
  • dir is the direction: 1 for forward or -1 backward

Example:

Otto.walk(2, 1000, 1);

In this example 2 is the number of steps, 1000 is "TIME" in milliseconds and it will walk forward.

For example changing T value: Slow=2000 Normal=1000 Fast= 500

Otto.turn(steps, T, dir);

(# of steps, T, to the left or -1 to the right)

Otto.bend (steps, T, dir);

(# of steps, T, 1 bends to the left or -1 to the right)

Otto.shakeLeg (steps, T, dir);

(# of steps, T, 1 bends to the left or -1 to the right)

Otto.jump(steps, T);

(# of steps up, T) this one does not have a dir parameter Otto doesn't really jump ;P

Dances:

Similar to movements but more fun! you can adjust a new parameter h "height or size of the movements" to make the dance more interesting.

Otto.moonwalker(steps, T, h, dir);

(# of steps, T, h, 1 to the left or -1 to the right)

h: you can try change between 15 and 40

Example:

Otto.moonwalker(3, 1000, 25,1);
Otto.crusaito(steps, T, h, dir);

(# of steps, T, h, 1 to the left or -1 to the right)

h: you can try change between 20 to 50

Otto.flapping(steps, T, h, dir);

(# of steps, T, h, 1 to the front or -1 to the back)

h: you can try change between 10 to 30

Otto.swing(steps, T, h);

h: you can try change between 0 to 50

Otto.tiptoeSwing(steps, T, h);

h: you can try change between 0 to 50

Otto.jitter(steps, T, h);

h: you can try change between 5 to 25

Otto.updown(steps, T, h);  

h: you can try change between 0 to 90

Otto.ascendingTurn(steps, T, h);

h: you can try change between 5 to 15

Sounds:

Otto.sing(songName);

By just changing what is inside the () we can change the sounds easily to 19 different ones. Simple as copying and pasting in a new row to make the sounds as many times as you like.

  • S_connection
  • S_disconnection
  • S_buttonPushed
  • S_mode1
  • S_mode2
  • S_mode3
  • S_surprise
  • S_OhOoh
  • S_OhOoh2
  • S_cuddly
  • S_sleeping
  • S_happy
  • S_superHappy
  • S_happy_short
  • S_sad
  • S_confused
  • S_fart1
  • S_fart2
  • S_fart3

Otto can emit several sounds with the 'sing' function:

Otto._tone(10, 3, 1);

(noteFrequency, noteDuration, silentDuration)

Otto.bendTones (100, 200, 1.04, 10, 10);

(initFrequency, finalFrequency, prop, noteDuration, silentDuration)

Gestures:

Finally, our favorite, This is a combination of the 2 previous functions we learnt sing + walk Their goal is to express emotions by combining sounds with movements at the same time and if you have the LED matrix you can show them in the robot mouth!

Otto.playGesture(gesture);
  • Otto.playGesture(OttoHappy);
  • Otto.playGesture(OttoSuperHappy);
  • Otto.playGesture(OttoSad);
  • Otto.playGesture(OttoVictory);
  • Otto.playGesture(OttoAngry);
  • Otto.playGesture(OttoSleeping);
  • Otto.playGesture(OttoFretful);
  • Otto.playGesture(OttoLove);
  • Otto.playGesture(OttoConfused);
  • Otto.playGesture(OttoFart);
  • Otto.playGesture(OttoWave);
  • Otto.playGesture(OttoMagic);
  • Otto.playGesture(OttoFail);

As you see it’s very simple, but what it does is quite advanced.

License

The OttoDIYLib is licensed under the terms of the GPL Open Source license and is available for free.

Welcome to the Otto DIY community

Big thanks to all our contributors

  • @JavierIH
  • @Obijuan
  • @jarsoftelectrical
  • @stembotvn
  • @sfranzyshen
  • @tehniq3
  • @logix5
  • @DiegoSSJ
  • @loreman
  • @justinotherguy
  • @bhm93
  • @wendtbw
  • @agomezgar
  • @BodoMinea
  • @chico
  • @PinkDev1
  • @MXZZ
  • @Pawka
  • @per1234
  • @FedericoBusero
  • @hulkco
  • @mishafarms
  • @nisha-appanah
  • @pabloevaristo
  • @ProgrammerBruce
  • @Nca78
  • @dleval
  • @coliss86
  • @namepatrik

How to Contribute:

Contributing to this software is warmly welcomed. There are 3 ways you can contribute to this project:

  1. Test and if find a problem then post an issue.
  2. Helps us solve the issues or other bugs.
  3. Improve the code. You can do this basically by forking, committing modifications and then pulling requests.Please add a change log and your contact into file header.

Thanks for your contribution in advance.

ottodiylib's People

Contributors

coliss86 avatar cparrapa avatar ehippy avatar jdvaz avatar merlinletekos avatar mishafarms avatar namepatrik avatar nca78 avatar robosorter avatar sentamugo7 avatar sfranzyshen avatar takujikawata-pr avatar wene avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ottodiylib's Issues

Issue with progmem variable in otto gestures library.

I encountered an issue while compiling a new Otto sketch. I do not have an hc-05, so I am using my adafruit bluefruit in its place. I have only begun to write the sketch, but I am using the adafruit bluefruit controller example as the basis for the sketch. When I try to compile it, I encounter this issue:

`
In file included from /home/builder/opt/libraries/ottodiylib_13_0_0/src/Otto.h:12:0,

from /tmp/540249432/Otto/Otto.ino:2:

/home/builder/opt/libraries/ottodiylib_13_0_0/src/Otto_gestures.h:44:56: error: expected initializer before 'PROGMEM'

const LED_Matrix_Font_6x8_TypeDef Character_font_6x8[] PROGMEM =

^~~~~~~

/home/builder/opt/libraries/ottodiylib_13_0_0/src/Otto_gestures.h:96:45: error: expected initializer before 'PROGMEM'

const unsigned long int Gesturetable[4][10] PROGMEM = {

^~~~~~~

Error during build: exit status 1`

This appears to be an issue in the library, but i am not entirely sure. Here is my code just in case:

`// OttoDIYLib - Version: Latest
#include <Otto.h>
Otto Otto;
/*********************************************************************
This is an example for our nRF51822 based Bluefruit LE modules

Pick one up today in the adafruit shop!

Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

MIT license, check LICENSE for more information
All text above, and the splash screen below must be included in
any redistribution
*********************************************************************/

#include <string.h>
#include <Arduino.h>
#include <SPI.h>
#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"

#include "BluefruitConfig.h"

#if SOFTWARE_SERIAL_AVAILABLE
#include <SoftwareSerial.h>
#endif

/*=========================================================================
APPLICATION SETTINGS

    FACTORYRESET_ENABLE    Perform a factory reset when running this sketch
   
    Enabling this will put your Bluefruit LE module
in a 'known good' state and clear any config
data set in previous sketches or projects, so
    running this at least once is a good idea.
   
    When deploying your project, however, you will
want to disable factory reset by setting this
value to 0.  If you are making changes to your
    Bluefruit LE device via AT commands, and those
changes aren't persisting across resets, this
is the reason why.  Factory reset will erase
the non-volatile memory where config data is
stored, setting it back to factory default
values.
       
    Some sketches that require you to bond to a
central device (HID mouse, keyboard, etc.)
won't work at all with this feature enabled
since the factory reset will clear all of the
bonding data stored on the chip, meaning the
central device won't be able to reconnect.
MINIMUM_FIRMWARE_VERSION Minimum firmware version to have some new features
MODE_LED_BEHAVIOUR LED activity, valid options are
"DISABLE" or "MODE" or "BLEUART" or
"HWUART" or "SPI" or "MANUAL"
-----------------------------------------------------------------------/
#define FACTORYRESET_ENABLE 1
#define MINIMUM_FIRMWARE_VERSION "0.6.6"
#define MODE_LED_BEHAVIOUR "MODE"
/
=========================================================================*/

// Create the bluefruit object, either software serial...uncomment these lines
/*
SoftwareSerial bluefruitSS = SoftwareSerial(BLUEFRUIT_SWUART_TXD_PIN, BLUEFRUIT_SWUART_RXD_PIN);

Adafruit_BluefruitLE_UART ble(bluefruitSS, BLUEFRUIT_UART_MODE_PIN,
BLUEFRUIT_UART_CTS_PIN, BLUEFRUIT_UART_RTS_PIN);
*/

/* ...or hardware serial, which does not need the RTS/CTS pins. Uncomment this line */
// Adafruit_BluefruitLE_UART ble(BLUEFRUIT_HWSERIAL_NAME, BLUEFRUIT_UART_MODE_PIN);

/* ...hardware SPI, using SCK/MOSI/MISO hardware SPI pins and then user selected CS/IRQ/RST */
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);

/* ...software SPI, using SCK/MOSI/MISO user-defined SPI pins and then user selected CS/IRQ/RST /
//Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_SCK, BLUEFRUIT_SPI_MISO,
// BLUEFRUIT_SPI_MOSI, BLUEFRUIT_SPI_CS,
// BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
//hc-sr04 pins
#define trigPin 6
#define echoPin 7
//bluefruit pins mode to rts = 12 to 8
//accelerometer pins xyz = A0,1,2
#define LeftLeg 2
#define RightLeg 3
#define LeftFoot 4
#define RightFoot 5
#define Buzzer 13
//accelerometer for balance
#define x A0
#define y A1
#define z A2
// A small helper
void error(const __FlashStringHelper
err) {
Serial.println(err);
while (1);
}

// function prototypes over in packetparser.cpp
uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout);
float parsefloat(uint8_t *buffer);
void printHex(const uint8_t * data, const uint32_t numBytes);

// the packet buffer
extern uint8_t packetbuffer[];

//
/*!
@brief Sets up the HW an the BLE module (this function is called
automatically on startup)
*/
/
/
void setup(void)
{
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(x, INPUT);
pinMode(y, INPUT);
pinMode(z, INPUT);
pinMode(Buzzer, OUTPUT);
Otto.init(LeftLeg, RightLeg, LeftFoot, RightFoot, true, Buzzer); //Set the servo pins and Buzzer pin
Otto.home();
while (!Serial); // required for Flora & Micro
delay(500);

Serial.begin(115200);
Serial.println(F("Adafruit Bluefruit App Controller Example"));
Serial.println(F("-----------------------------------------"));

/* Initialise the module */
Serial.print(F("Initialising the Bluefruit LE module: "));

if ( !ble.begin(VERBOSE_MODE) )
{
error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
}
Serial.println( F("OK!") );

if ( FACTORYRESET_ENABLE )
{
/* Perform a factory reset to make sure everything is in a known state */
Serial.println(F("Performing a factory reset: "));
if ( ! ble.factoryReset() ) {
error(F("Couldn't factory reset"));
}
}

/* Disable command echo from Bluefruit */
ble.echo(false);

Serial.println("Requesting Bluefruit info:");
/* Print Bluefruit information */
ble.info();

Serial.println(F("Please use Adafruit Bluefruit LE app to connect in Controller mode"));
Serial.println(F("Then activate/use the sensors, color picker, game controller, etc!"));
Serial.println();

ble.verbose(false); // debug info is a little annoying after this point!

/* Wait for connection */
while (! ble.isConnected()) {
delay(500);
}

Serial.println(F("******************************"));

// LED Activity command is only supported from 0.6.6
if ( ble.isVersionAtLeast(MINIMUM_FIRMWARE_VERSION) )
{
// Change Mode LED Activity
Serial.println(F("Change LED activity to " MODE_LED_BEHAVIOUR));
ble.sendCommandCheckOK("AT+HWModeLED=" MODE_LED_BEHAVIOUR);
}

// Set Bluefruit to DATA mode
Serial.println( F("Switching to DATA mode!") );
ble.setMode(BLUEFRUIT_MODE_DATA);

Serial.println(F("******************************"));

}
//uncoment the next section if using ultrasonic sensor.
/*
long ultrasound() {
long duration, distance;
digitalWrite(Trigger,LOW);
delayMicroseconds(2);
digitalWrite(Trigger, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger, LOW);
duration = pulseIn(Echo, HIGH);
distance = duration/58;
return distance;
}
/
/**************************************************************************/
/
!
@brief Constantly poll for new command or response data
/
/**************************************************************************/
void loop(void)
{
/
Wait for new data to arrive */
uint8_t len = readPacket(&ble, BLE_READPACKET_TIMEOUT);
if (len == 0) return;

/* Got a packet! */
// printHex(packetbuffer, len);

// Color
if (packetbuffer[1] == 'C') {
uint8_t red = packetbuffer[2];
uint8_t green = packetbuffer[3];
uint8_t blue = packetbuffer[4];
Serial.print ("RGB #");
if (red < 0x10) Serial.print("0");
Serial.print(red, HEX);
if (green < 0x10) Serial.print("0");
Serial.print(green, HEX);
if (blue < 0x10) Serial.print("0");
Serial.println(blue, HEX);
}

// Buttons
if (packetbuffer[1] == 'B') {
uint8_t buttnum = packetbuffer[2] - '0';
boolean pressed = packetbuffer[3] - '0';
Serial.print ("Button "); Serial.print(buttnum);
if (pressed) {
Serial.println(" pressed");

  if (buttnum == 5) {
    Otto.walk(2, 1000, 1);
    //delay(500);
  }
  else if (buttnum == 6) {
    Otto.walk(2, 2000, -1);
    //delay(500)
  }
  else if (buttnum == 8) {
    Otto.turn(2, 1000, 1);
    //delay(500)
  }
  else if (buttnum == 7) {
    Otto.turn(2, 1000, -1);
    //delay(500);
  }
  else if (buttnum == 1) {
    //        Otto.playGesture(OttoHappy);
    delay(1000);
    Otto.home();
  }
}



else {
  Serial.println(" released");
  Otto.home();
}

}

// GPS Location
if (packetbuffer[1] == 'L') {
float lat, lon, alt;
lat = parsefloat(packetbuffer + 2);
lon = parsefloat(packetbuffer + 6);
alt = parsefloat(packetbuffer + 10);
Serial.print("GPS Location\t");
Serial.print("Lat: "); Serial.print(lat, 4); // 4 digits of precision!
Serial.print('\t');
Serial.print("Lon: "); Serial.print(lon, 4); // 4 digits of precision!
Serial.print('\t');
Serial.print(alt, 4); Serial.println(" meters");
}

// Accelerometer
if (packetbuffer[1] == 'A') {
float x, y, z;
x = parsefloat(packetbuffer + 2);
y = parsefloat(packetbuffer + 6);
z = parsefloat(packetbuffer + 10);
Serial.print("Accel\t");
Serial.print(x); Serial.print('\t');
Serial.print(y); Serial.print('\t');
Serial.print(z); Serial.println();
}

// Magnetometer
if (packetbuffer[1] == 'M') {
float x, y, z;
x = parsefloat(packetbuffer + 2);
y = parsefloat(packetbuffer + 6);
z = parsefloat(packetbuffer + 10);
Serial.print("Mag\t");
Serial.print(x); Serial.print('\t');
Serial.print(y); Serial.print('\t');
Serial.print(z); Serial.println();
}

// Gyroscope
if (packetbuffer[1] == 'G') {
float x, y, z;
x = parsefloat(packetbuffer + 2);
y = parsefloat(packetbuffer + 6);
z = parsefloat(packetbuffer + 10);
Serial.print("Gyro\t");
Serial.print(x); Serial.print('\t');
Serial.print(y); Serial.print('\t');
Serial.print(z); Serial.println();
}

// Quaternions
if (packetbuffer[1] == 'Q') {
float x, y, z, w;
x = parsefloat(packetbuffer + 2);
y = parsefloat(packetbuffer + 6);
z = parsefloat(packetbuffer + 10);
w = parsefloat(packetbuffer + 14);
Serial.print("Quat\t");
Serial.print(x); Serial.print('\t');
Serial.print(y); Serial.print('\t');
Serial.print(z); Serial.print('\t');
Serial.print(w); Serial.println();
}
}
`
Thank you, please reply if possible!

change speed

Hello, changing the speed in movelegs are not possible :(

where is otto9?

Sorry, just get back to this after several years, look at my existing code, I was using otto9, but now is it gone?

possible bug

Otto9.cpp [void Otto9::walk() routine]
line 251 has:
int O[4] = {0, 0, 4, -4};

Oscillator.h
line 46 has:
unsigned int _O; //-- Offset (degrees)

O[4][3] is putting -4 into an unsigned int

General

Reset button is not working

variable "O" is defined as a 'unsigned int' instead of 'int'

At line 26 and 46 in oscillator.h, variable "O" is defined as a 'unsigned int' instead of 'int'.
"O" have negative value such as when Otto walk (Otto9.cpp line 254).
There is no apparent impact on Arduino/Atmega but math results are out of wack on ESP32.

Solution: Change data type from "unsigned int" to "int" for variable "O" and "A" at lines 25,26,45,46 in oscillator.h

Wemos D1 mini with Soft WDT reset

I use Wemos D1 mini with my OTTO Robot, sometimes it goes with Soft WDT reset as follows.

My Code is as below:


#include <Otto.h>


#define LeftLeg 14 // left leg pin, servo[0]
#define RightLeg 12 // right leg pin, servo[1]
#define LeftFoot 13 // left foot pin, servo[2]
#define RightFoot 15 // right foot pin, servo[3]
#define Buzzer 16 //buzzer pin

Otto Otto;
String inputData;

void setup() {
  Serial.begin(9600);
  inputData = "home";
  Otto.init(LeftLeg, RightLeg, LeftFoot, RightFoot, true, Buzzer);
}

void loop() {
  if (Serial.available() > 0) {
    inputData = Serial.readString();
    inputData.trim();
    Serial.println(inputData);
    if (String(inputData).equals(String("home"))) {
      Otto.home();

    }
    if (String(inputData).equals(String("forward"))) {
      Otto.walk(1, 1000, 1); // FORWARD
      Otto.walk(1, 1000, 1); // FORWARD
      Otto.walk(1, 1000, 1); // FORWARD

    }
    if (String(inputData).equals(String("backward"))) {
      Otto.walk(1, 1000, -1);
      Otto.walk(1, 1000, -1);
      Otto.walk(1, 1000, -1);

    }
    if (String(inputData).equals(String("OttoHappy"))) {
      Otto.playGesture(OttoHappy);

    }
    if (String(inputData).equals(String("OttoSuperHappy"))) {
      Otto.playGesture(OttoSuperHappy);

    }
    if (String(inputData).equals(String("OttoSad"))) {
      Otto.playGesture(OttoSad);

    }
    if (String(inputData).equals(String("OttoSleeping"))) {
      Otto.playGesture(OttoSleeping);

    }
    if (String(inputData).equals(String("OttoConfused"))) {
      Otto.playGesture(OttoConfused);

    }
    if (String(inputData).equals(String("OttoFretful"))) {
      Otto.playGesture(OttoFretful);

    }
    if (String(inputData).equals(String("OttoLove"))) {
      Otto.playGesture(OttoLove);

    }
    if (String(inputData).equals(String("OttoAngry"))) {
      Otto.playGesture(OttoAngry);

    }
    if (String(inputData).equals(String("OttoMagic"))) {
      Otto.playGesture(OttoMagic);

    }
    if (String(inputData).equals(String("OttoWave"))) {
      Otto.playGesture(OttoWave);

    }
    if (String(inputData).equals(String("OttoVictory"))) {
      Otto.playGesture(OttoVictory);

    }
    if (String(inputData).equals(String("OttoFail"))) {
      Otto.playGesture(OttoFail);

    }
    if (String(inputData).equals(String("OttoFart"))) {
      Otto.playGesture(OttoFart);

    }

  }

}

After I send 'forward' in serial port, exception occurs.

forward   

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffcc0 end: 3fffffc0 offset: 01a0
3ffffe60:  00000000 00000000 4bc6a7f0 00000000  
3ffffe70:  035d2f80 3ffee9a4 4010055c 0002e8cf  
3ffffe80:  00000000 41075fd0 00000000 3ffee818  
3ffffe90:  3ffee818 41075fd0 3ffee818 402014a0  
3ffffea0:  49153a0b bfe728d4 00000000 402015f0  
3ffffeb0:  3ffee778 41075fd0 00000000 402019cc  
3ffffec0:  41074090 3fffff50 3fffff40 00000000  
3ffffed0:  3fffff20 000003e8 3ffee778 3fffff40  
3ffffee0:  3fffff20 000003e8 3ffee778 40201a74  
3ffffef0:  3fffff50 3f800000 00000001 00000000  
3fffff00:  3ffe8a8f 805fa1fb 000a0d00 00000001  
3fffff10:  3ffee778 000003e8 3f800000 40201b7c  
3fffff20:  00000000 00000000 00000000 00000000  
3fffff30:  54442d18 bff921fb 54442d18 bff921fb  
3fffff40:  00000000 00000000 00000004 fffffffc  
3fffff50:  00000014 00000014 00000014 00000014  
3fffff60:  3fffdad0 3fffff80 3ffee768 3ffeeac4  
3fffff70:  3ffee778 3f800000 3ffee768 4020119a  
3fffff80:  77726f00 00647261 80000001 77726f00  
3fffff90:  00647261 80000000 3ffeea84 4010019d  
3fffffa0:  3fffdad0 00000000 3ffeea84 40203f48  
3fffffb0:  feefeffe feefeffe 3ffe84e0 40100f3d  
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

After I send 'OttoLove ' in serial port, exception occurs.

⸮⸮OttoLove 

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffb40 end: 3fffffc0 offset: 01a0
3ffffce0:  52832580 3fe4e63c 3ffffd60 40594bc7  
3ffffcf0:  000005e0 00000020 40103895 3ffecfc0  
3ffffd00:  11c12f3a 00418937 11c12f3a 00000000  
3ffffd10:  11c12f3a 00000000 00418937 00000000  
3ffffd20:  00000000 4bc6a7f0 40100541 4bc6a7f0  
3ffffd30:  00000000 00000000 4bc6a7f0 00000000  
3ffffd40:  05415fe6 40104a77 4010055c 00048b91  
3ffffd50:  00000000 411231b8 00000000 3ffee818  
3ffffd60:  3ffee818 411231b8 3ffee818 402014a0  
3ffffd70:  774b339c 3fe371e9 00000000 402015f0  
3ffffd80:  3ffee778 411231b8 00000000 402019cc  
3ffffd90:  41121a48 3ffffe20 3ffffe10 00000000  
3ffffda0:  3ffffdf0 000005dc 3ffee778 3ffffe10  
3ffffdb0:  3ffffdf0 000005dc 3ffee778 40201a74  
3ffffdc0:  3ffffe20 40000000 00000002 00000001  
3ffffdd0:  3ffee180 804721fb 00000007 40000000  
3ffffde0:  00000010 00000001 fffffff5 40201d44  
3ffffdf0:  00000000 40568000 00000000 40568000  
3ffffe00:  00000000 00000000 382d7365 bff0c152  
3ffffe10:  00000000 00000000 0000000b fffffff5  
3ffffe20:  00000019 00000019 0000000f 0000000f  
3ffffe30:  3ffee778 000005dc 78362e41 3ffeeac4  
3ffffe40:  3fffdad0 00000001 3ffee778 3ffeeac4  
3ffffe50:  3fffdad0 00000001 3ffee778 4020272c  
3ffffe60:  00001413 3fffc6fc 1302e850 4bc6a7f0  
3ffffe70:  0000005a 0000005a 00000022 00000023  
3ffffe80:  0000005a 0000005a 0000002a 00000023  
3ffffe90:  0000005a 0000005a 00000037 00000023  
3ffffea0:  0000005a 0000005a 00000046 00000023  
3ffffeb0:  0000005a 0000005a 0000005a 0000006e  
3ffffec0:  00000046 00000046 0000005a 0000005a  
3ffffed0:  0000006e 0000006e 0000005a 0000005a  
3ffffee0:  0000005a 0000005a 00000046 0000006e  
3ffffef0:  0000006e 00000046 0000005a 0000005a  
3fffff00:  0000005a 0000005a 00000091 00000050  
3fffff10:  0000005a 0000005a 00000050 0000007a  
3fffff20:  0000005a 0000005a 00000091 0000007a  
3fffff30:  00000064 00000050 0000003c 00000078  
3fffff40:  0000006e 00000046 00000014 000000a0  
3fffff50:  3fffff8c 3fffff80 3fffff8c 402036b1  
3fffff60:  3fffdad0 3fffff80 3ffee768 3ffeeac4  
3fffff70:  3fffdad0 00000001 3ffee768 4020131e  
3fffff80:  6f747400 65766f4c 80000000 6f747400  
3fffff90:  65766f4c 80000000 3ffeea84 4010019d  
3fffffa0:  3fffdad0 00000000 3ffeea84 40203f48  
3fffffb0:  feefeffe feefeffe 3ffe84e0 40100f3d  
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------
⸮⸮


I decoding the stack with Exception Decoder as below.

Decoding stack results
0x4010055c: millis() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\core_esp8266_wiring.cpp line 188
0x402014a0: Oscillator::next_sample() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\libraries\OttoNEW\Oscillator.cpp line 26
0x402015f0: Oscillator::refresh() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\libraries\OttoNEW\Oscillator.cpp line 109
0x402019cc: Otto::oscillateServos(int*, int*, int, double*, float) at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\libraries\OttoNEW\Otto.cpp line 136
0x40201a74: Otto::_execute(int*, int*, int, double*, float) at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\libraries\OttoNEW\Otto.cpp line 153
0x40201b7c: Otto::walk(float, int, int) at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\libraries\OttoNEW\Otto.cpp line 221
0x4020119a: loop() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\my-esp-otto-crashes/my-esp-otto-crashes.ino line 34
0x4010019d: esp_schedule() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\core_esp8266_main.cpp line 125
0x40203f48: loop_wrapper() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\core_esp8266_main.cpp line 197
Decoding stack results
0x40100541: millis() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\core_esp8266_wiring.cpp line 185
0x4010055c: millis() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\core_esp8266_wiring.cpp line 188
0x402014a0: Oscillator::next_sample() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\libraries\OttoNEW\Oscillator.cpp line 26
0x402015f0: Oscillator::refresh() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\libraries\OttoNEW\Oscillator.cpp line 109
0x402019cc: Otto::oscillateServos(int*, int*, int, double*, float) at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\libraries\OttoNEW\Otto.cpp line 136
0x40201a74: Otto::_execute(int*, int*, int, double*, float) at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\libraries\OttoNEW\Otto.cpp line 153
0x40201d44: Otto::crusaito(float, int, int, int) at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\libraries\OttoNEW\Otto.cpp line 496
0x4020272c: Otto::playGesture(int) at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\libraries\OttoNEW\Otto.cpp line 865
0x402036b1: String::invalidate() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\WString.cpp line 140
0x4020131e: loop() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\sketchbook\my-esp-otto-crashes/my-esp-otto-crashes.ino line 68
0x4010019d: esp_schedule() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\core_esp8266_main.cpp line 125
0x40203f48: loop_wrapper() at E:\Mixly_WIN\Mixly_WIN\arduino\portable\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\core_esp8266_main.cpp line 197

How to fix this bug.Thanks.

OTTO_frog

Hi! Where I can download OTTO_frog library? Thank you

Errors when trying to complile

I am on OS X. I installed all the libraries as instructed. I am able to use the blockly website to create code, paste it into the Arduino IDE and upload and run the code. However, we have OttoDIYPlus and my kids want to use the bluetooth app (there is no Blockly version of the bluetooth code that I can see). I tried opening the DIYplus BT INO file V9 and V10, but even with the libraries installed I get many error messages related to the libraries, specifically regarding serial communication. I am pasting them below. Please give guidance.

`Arduino: 1.8.13 (Mac OS X), Board: "Arduino Nano, ATmega328P (Old Bootloader)"

OttoPLUS_APP_V10:25:1: error: 'SoftwareSerial' does not name a type; did you mean 'HardwareSerial'?
SoftwareSerial BTserial = SoftwareSerial(11,12); // TX RX of the Bluetooth
^~~~~~~~~~~~~~
HardwareSerial
OttoPLUS_APP_V10:26:20: error: 'BTserial' was not declared in this scope
SerialCommand SCmd(BTserial); //The SerialCommand object
^~~~~~~~
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino:26:20: note: suggested alternative: 'Serial'
SerialCommand SCmd(BTserial); //The SerialCommand object
^~~~~~~~
Serial
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino: In function 'void setup()':
OttoPLUS_APP_V10:94:3: error: 'BTserial' was not declared in this scope
BTserial.begin(9600);
^~~~~~~~
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino:94:3: note: suggested alternative: 'Serial'
BTserial.begin(9600);
^~~~~~~~
Serial
OttoPLUS_APP_V10:123:8: error: 'class SerialCommand' has no member named 'addDefaultHandler'; did you mean 'setDefaultHandler'?
SCmd.addDefaultHandler(receiveStop);
^~~~~~~~~~~~~~~~~
setDefaultHandler
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino: In function 'void move(int)':
OttoPLUS_APP_V10:434:3: error: 'BTserial' was not declared in this scope
BTserial.println("M:END");
^~~~~~~~
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino:434:3: note: suggested alternative: 'Serial'
BTserial.println("M:END");
^~~~~~~~
Serial
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino: In function 'void receiveGesture()':
OttoPLUS_APP_V10:495:3: error: 'BTserial' was not declared in this scope
BTserial.println("H:END");
^~~~~~~~
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino:495:3: note: suggested alternative: 'Serial'
BTserial.println("H:END");
^~~~~~~~
Serial
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino: In function 'void receiveName()':
OttoPLUS_APP_V10:687:5: error: 'BTserial' was not declared in this scope
BTserial.write("AT+NAMEOTTODIA");
^~~~~~~~
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino:687:5: note: suggested alternative: 'Serial'
BTserial.write("AT+NAMEOTTODIA");
^~~~~~~~
Serial
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino: In function 'void requestName()':
OttoPLUS_APP_V10:710:3: error: 'BTserial' was not declared in this scope
BTserial.print("E:");
^~~~~~~~
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino:710:3: note: suggested alternative: 'Serial'
BTserial.print("E:");
^~~~~~~~
Serial
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino: In function 'void requestDistance()':
OttoPLUS_APP_V10:723:3: error: 'BTserial' was not declared in this scope
BTserial.print("D:");
^~~~~~~~
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino:723:3: note: suggested alternative: 'Serial'
BTserial.print("D:");
^~~~~~~~
Serial
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino: In function 'void requestNoise()':
OttoPLUS_APP_V10:736:3: error: 'BTserial' was not declared in this scope
BTserial.print("N:");
^~~~~~~~
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino:736:3: note: suggested alternative: 'Serial'
BTserial.print("N:");
^~~~~~~~
Serial
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino: In function 'void requestBattery()':
OttoPLUS_APP_V10:750:3: error: 'BTserial' was not declared in this scope
BTserial.print("B:");
^~~~~~~~
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino:750:3: note: suggested alternative: 'Serial'
BTserial.print("B:");
^~~~~~~~
Serial
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino: In function 'void requestProgramId()':
OttoPLUS_APP_V10:762:3: error: 'BTserial' was not declared in this scope
BTserial.print("I:");
^~~~~~~~
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino:762:3: note: suggested alternative: 'Serial'
BTserial.print("I:");
^~~~~~~~
Serial
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino: In function 'bool checkIfConnected()':
OttoPLUS_APP_V10:815:17: error: 'BTserial' was not declared in this scope
while(BTserial.available() > 0) {
^~~~~~~~
/Users/devinnamaky/Downloads/otto-diy-plus/Codes/OttoPLUS_APP_V10/OttoPLUS_APP_V10.ino:815:17: note: suggested alternative: 'Serial'
while(BTserial.available() > 0) {
^~~~~~~~
Serial
Multiple libraries were found for "Servo.h"
Used: /Users/devinnamaky/Google Drive/Arduino/libraries/Servo
Not used: /Applications/Arduino.app/Contents/Java/libraries/Servo
Multiple libraries were found for "Adafruit_NeoPixel.h"
Used: /Users/devinnamaky/Google Drive/Arduino/libraries/Adafruit_NeoPixel
Not used: /Users/devinnamaky/Google Drive/Arduino/libraries/OttoDIYLib-master
Multiple libraries were found for "SerialCommand.h"
Used: /Users/devinnamaky/Google Drive/Arduino/libraries/Arduino-SerialCommand-master
Not used: /Users/devinnamaky/Google Drive/Arduino/libraries/OttoDIYLib-master
exit status 1
'SoftwareSerial' does not name a type; did you mean 'HardwareSerial'?

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
`

Major lack of library functions documentation

To begin with, i work as course planning helper at robotics club, and i've got task to help preparing part of course that involves using Otto robots (we did not ordered them from OttoDIY tho, we have made our own kits using lasercut plywood and other components ordered from China). After some research, i found this library, but i found no proper documentation/description of all or, at least, most functions available. This is bad, as not everyone will be able to see that easily, what functions they can use, what parameters they have to pass, how it all works in general. If Otto is intended to be robotics programming educational platform, then there should be at least some function description readily available either there on github, or on website (or on both).

If there is some actual documentation available, then please, post a link somewhere so people can easily find it, or point me to it, i'll be thankful

Thanks in advance

Otto Otto; not working

I've been working on this Otto bot for a week or so now and can't get this code to run. I have the OttoDIYlib - master library installed but it still isn't working. It says there is no matching function for call to 'Otto::Otto()'.
Here is the full error message.

Otto_cantstopthefelling:6:6: error: no matching function for call to 'Otto::Otto()'
Otto Otto;
^~~~
In file included from \flame\Students\9976\My Documents\Arduino\libraries\OttoDIYLib-master\examples\Dance\Otto_cantstopthefelling\Otto_cantstopthefelling.ino:5:0:
\flame\Students\9976\My Documents\Arduino\libraries\OttoArduinoLib\src/Otto.h:39:9: note: candidate: Otto::Otto(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t)
Otto(uint8_t legLeft, uint8_t legRight, uint8_t footLeft, uint8_t footRight, uint8_t pinNoiseSensor, uint8_t pinBuzzer, uint8_t pinUSTrigger, uint8_t pinUSEcho);
^~~~
\flame\Students\9976\My Documents\Arduino\libraries\OttoArduinoLib\src/Otto.h:39:9: note: candidate expects 8 arguments, 0 provided
\flame\Students\9976\My Documents\Arduino\libraries\OttoArduinoLib\src/Otto.h:34:7: note: candidate: constexpr Otto::Otto(const Otto&)
class Otto: public OttoSound, public OttoSensor, public OttoServo<_NBR_OF_SERVO>
^~~~
\flame\Students\9976\My Documents\Arduino\libraries\OttoArduinoLib\src/Otto.h:34:7: note: candidate expects 1 argument, 0 provided
\flame\Students\9976\My Documents\Arduino\libraries\OttoArduinoLib\src/Otto.h:34:7: note: candidate: constexpr Otto::Otto(Otto&&)
\flame\Students\9976\My Documents\Arduino\libraries\OttoArduinoLib\src/Otto.h:34:7: note: candidate expects 1 argument, 0 provided
\flame\Students\9976\My Documents\Arduino\libraries\OttoDIYLib-master\examples\Dance\Otto_cantstopthefelling\Otto_cantstopthefelling.ino: In function 'void setup()':
Otto_cantstopthefelling:14:65: error: no matching function for call to 'Otto::init(int, int, int, int, bool, int)'
Otto.init(LeftLeg, RightLeg, LeftFoot, RightFoot, true, Buzzer); //Set the servo pins and Buzzer pin
^
In file included from \flame\Students\9976\My Documents\Arduino\libraries\OttoDIYLib-master\examples\Dance\Otto_cantstopthefelling\Otto_cantstopthefelling.ino:5:0:
\flame\Students\9976\My Documents\Arduino\libraries\OttoArduinoLib\src/Otto.h:41:14: note: candidate: void Otto::init(bool)
void init(bool load_calibration);
^~~~
\flame\Students\9976\My Documents\Arduino\libraries\OttoArduinoLib\src/Otto.h:41:14: note: candidate expects 1 argument, 6 provided
Multiple libraries were found for "Otto.h"
Used: \flame\Students\9976\My Documents\Arduino\libraries\OttoArduinoLib
Not used: \flame\Students\9976\My Documents\Arduino\libraries\OttoDIYLib-master
Not used: \flame\Students\9976\My Documents\Arduino\libraries\OttoArduinoLib-main
exit status 1
no matching function for call to 'Otto::Otto()

EEPROM values should have checksum or tag

When I installed a sample sketch onto a new Nano - with otto.init(true), apparently there was garbage in the EEPROM, which resulted in very tense and weird leg positions.

The EEPROM values should have a tag at the start (say, "OTTO") or a checksum or both. If they don't match, the console should log an error and the values should be discarded.

Oscillator.h library problem

Bonjour! When I try to run some sketchbooks in Arduino IDE, I have this error message : "Oscillator.h : no such file or directory." The other librairies are ok. Thank you!

OTTO programs using touch sensor behave oddly

OTTO touch sensor is using TTP223B chip. Sensor is hardwired to work in "toggle" mode and power on initial state is LOW. At every touch sensor toggles its output between states. Program must first expect to read HIGH value and then LOW value etc.

error compiling

sorry i'm beginner and i want to build ottoDIY, but i just get error compiling just shown on the picture. even though I already entered the otto libraries file into the arduino libraries
Capture_

Other Otto Robots BLE App Code

Hello,

Per the powerpoints and things on the website, there used to be code available for all the different robots to be controlled via bluetooth at one point in the past (i.e. it has listed different bluetooth programs such as OttoW_APP as an example program that used to be provided by this library which I simply take to mean there was a version of app code that worked with Otto Wheels).

What happened? Now everything runs off of the Otto object defined in Otto.h and Otto.cpp which clearly only corresponds to the original Otto Starter. Whatever happened that got rid of these entirely?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.