Slide show
 
PDFPrintE-mail


MP3 Shield for arduino with VS1053 module
View Full-Size Image


MP3 Shield for arduino with VS1053 module

( MISC )
SG$23.70


The VS1053 is a great MP3 decoder, it is capable of decoding Ogg Vorbis/MP3/AAC/WMA/MIDI audio and encoding IMA ADPCM and user-loadable Ogg Vorbis, can drive 30 ohm headphones with no additional power supply. This VS1053 MP3 Shield is designed based on VS1053B from VLSI. For the best headphone listening experience, the VS1053 includes EarSpeaker spatial processing which accurately simulates how a room with stereo loudspeakers would sound. In addition to being able to decode all major formats, VS1053 is capable of recording in Ogg Vobis files.     With the SD card slot on the other side of the board, you can play mp3 files from SD card using this shield. It is easily to drop it in your project or make a mp3 player using your Arduino.

Features

  • Can play a variety of music formats, support for OGG encoding real-time recording
  • SPI interface, the control signal lines are led out
  • A headphone and stereo output
  • A microphone for recording
  • A line_in input interface
  • Power indicator
  • 3.3V and 2.8V of LDO chip AMS-1117 on board, provides up to 800mA current
  • A single power supply: +5 VDC
  • 12.288 Mhz crystal
  • SD card slot

Decodes formats

  • Ogg Vorbis
  • MP3 = MPEG 1 & 2 audio layer III (CBR+VBR+ABR)
  • MP1 & MP2 = MPEG 1 & 2 audio layers I & II optional
  • MPEG4 / 2 AAC-LC(+PNS), HE-AAC v2 (Level 3) (SBR + PS)
  • WMA4.0/4.1/7/8/9 all profiles (5-384 kbps)
  • FLAC lossless audio with software plugin (upto 24 bits, 48 kHz)
  • WAV (PCM + IMA ADPCM)
  • General MIDI 1 / SP-MIDI format 0

Encodes formats from mic/line

  • Ogg Vorbis with software plugin
  • IMA ADPCM
  • 16-bit PCM

Manual and techsupport

1.Plug VS1053 MP3 Shield onto the Arduino. Connect the board to PC using USB cable.

 

2.After connecting your Arduino to the VS1053 MP3 Shield, insert the SD card which stores your mp3 files with the filename like "track001.mp3", "track002.mp3" and etc into the SD card slot.

3.Download the MP3Shield Library Demo code and put them in the folder /Arduino1.0/libraries/. 4.Open the code directly by the path:File -> Examples ->SFEMP3Shield->Examples->MP3Shield_Library_Demo.

#include 

//Add the SdFat Libraries
#include 
#include 

//and the MP3 Shield Library
#include 

// Below is not needed if interrupt driven. Safe to remove if not using.
#if defined(USE_MP3_REFILL_MEANS) && USE_MP3_REFILL_MEANS == USE_MP3_Timer1
  #include 
#elif defined(USE_MP3_REFILL_MEANS) && USE_MP3_REFILL_MEANS == USE_MP3_SimpleTimer
  #include 
#endif

/**
 * brief Object instancing the SdFat library.
 *
 * principal object for handling all SdCard functions.
 */
SdFat sd;

/**
 * brief Object instancing the SFEMP3Shield library.
 *
 * principal object for handling all the attributes, members and functions for the library.
 */
SFEMP3Shield MP3player;

//------------------------------------------------------------------------------
/**
 * brief Setup the Arduino Chip's feature for our use.
 *
 * After Arduino's kernel has booted initialize basic features for this
 * application, such as Serial port and MP3player objects with .begin.
 * Along with displaying the Help Menu.
 *
 * note returned Error codes are typically passed up from MP3player.
 * Whicn in turns creates and initializes the SdCard objects.
 *
 * see
 * ref Error_Codes
 */
void setup() {

  uint8_t result; //result code from some function as to be tested at later time.

  Serial.begin(115200);

  Serial.print(F("F_CPU = "));
  Serial.println(F_CPU);
  Serial.print(F("Free RAM = ")); // available in Version 1.0 F() bases the string to into Flash, to use less SRAM.
  Serial.print(FreeRam(), DEC);  // FreeRam() is provided by SdFatUtil.h
  Serial.println(F(" Should be a base line of 1028, on ATmega328 when using INTx"));


  //Initialize the SdCard.
  if(!sd.begin(SD_SEL, SPI_FULL_SPEED)) sd.initErrorHalt();
  // depending upon your SdCard environment, SPI_HAVE_SPEED may work better.
  if(!sd.chdir("/")) sd.errorHalt("sd.chdir");

  //Initialize the MP3 Player Shield
  result = MP3player.begin();
  //check result, see readme for error codes.
  if(result != 0) {
    Serial.print(F("Error code: "));
    Serial.print(result);
    Serial.println(F(" when trying to start MP3 player"));
    if( result == 6 ) {
      Serial.println(F("Warning: patch file not found, skipping.")); // can be removed for space, if needed.
      Serial.println(F("Use the "d" command to verify SdCard can be read")); // can be removed for space, if needed.
    }
  }

#if defined(__BIOFEEDBACK_MEGA__) // or other reasons, of your choosing.
  // Typically not used by most shields, hence commented out.
  Serial.println(F("Applying ADMixer patch."));
  if(MP3player.ADMixerLoad("admxster.053") == 0) {
    Serial.println(F("Setting ADMixer Volume."));
    MP3player.ADMixerVol(-3);
  }
#endif

  help();
}

//------------------------------------------------------------------------------
/**
 * brief Main Loop the Arduino Chip
 *
 * This is called at the end of Arduino kernel's main loop before recycling.
 * And is where the user's serial input of bytes are read and analyzed by
 * parsed_menu.
 *
 * Additionally, if the means of refilling is not interrupt based then the
 * MP3player object is serviced with the availaible function.
 *
 * note Actual examples of the libraries public functions are implemented in
 * the parse_menu() function.
 */
void loop() {

// Below is only needed if not interrupt driven. Safe to remove if not using.
#if defined(USE_MP3_REFILL_MEANS) 
    && ( (USE_MP3_REFILL_MEANS == USE_MP3_SimpleTimer) 
    ||   (USE_MP3_REFILL_MEANS == USE_MP3_Polled)      )

  MP3player.available();
#endif

  if(Serial.available()) {
    parse_menu(Serial.read()); // get command from serial input
  }

  delay(100);
}

uint32_t  millis_prv;

//------------------------------------------------------------------------------
/**
 * brief Decode the Menu.
 *
 * Parses through the characters of the users input, executing corresponding
 * MP3player library functions and features then displaying a brief menu and
 * prompting for next input command.
 */
void parse_menu(byte key_command) {

  uint8_t result; // result code from some function as to be tested at later time.

  // Note these buffer may be desired to exist globably.
  // but do take much space if only needed temporarily, hence they are here.
  char title[30]; // buffer to contain the extract the Title from the current filehandles
  char artist[30]; // buffer to contain the extract the artist name from the current filehandles
  char album[30]; // buffer to contain the extract the album name from the current filehandles

  Serial.print(F("Received command: "));
  Serial.write(key_command);
  Serial.println(F(" "));

  //if s, stop the current track
  if(key_command == 's') {
    Serial.println(F("Stopping"));
    MP3player.stopTrack();

  //if 1-9, play corresponding track
  } else if(key_command >= '1' && key_command = 254) { // range check
        mp3_vol.byte[1] = 254;
      } else {
        mp3_vol.byte[1] += 2; // keep it simpler with whole dB's
      }
    } else {
      if(mp3_vol.byte[1] >1, 1);
    Serial.println(F("[dB]"));

  //if  to change Play Speed
  } else if((key_command == '>') || (key_command == '') { // note dB is negative
      // assume equal balance and use byte[1] for math
      if(playspeed >= 254) { // range check
        playspeed = 5;
      } else {
        playspeed += 1; // keep it simpler with whole dB's
      }
    } else {
      if(playspeed == 0) { // range check
        playspeed = 0;
      } else {
        playspeed -= 1;
      }
    }
    MP3player.setPlaySpeed(playspeed); // commit new playspeed
    Serial.print(F("playspeed to "));
    Serial.println(playspeed, DEC);

  /* Alterativly, you could call a track by it's file name by using playMP3(filename);
  But you must stick to 8.1 filenames, only 8 characters long, and 3 for the extension */
  } else if(key_command == 'f' || key_command == 'F') {
    uint32_t offset = 0;
    if (key_command == 'F') {
      offset = 2000;
    }

    //create a string with the filename
    char trackName[] = "track001.mp3";

#if USE_MULTIPLE_CARDS
    sd.chvol(); // assign desired sdcard's volume.
#endif
    //tell the MP3 Shield to play that file
    result = MP3player.playMP3(trackName, offset);
    //check result, see readme for error codes.
    if(result != 0) {
      Serial.print(F("Error code: "));
      Serial.print(result);
      Serial.println(F(" when trying to play track"));
    }

  /* Display the file on the SdCard */
  } else if(key_command == 'd') {
    if(!MP3player.isPlaying()) {
      // prevent root.ls when playing, something locks the dump. but keeps playing.
      // yes, I have tried another unique instance with same results.
      // something about SdFat and its 500byte cache.
      Serial.println(F("Files found (name date time size):"));
      sd.ls(LS_R | LS_DATE | LS_SIZE);
    } else {
      Serial.println(F("Busy Playing Files, try again later."));
    }

  /* Get and Display the Audio Information */
  } else if(key_command == 'i') {
    MP3player.getAudioInfo();

  } else if(key_command == 'p') {
    if( MP3player.getState() == playback) {
      MP3player.pauseMusic();
      Serial.println(F("Pausing"));
    } else if( MP3player.getState() == paused_playback) {
      MP3player.resumeMusic();
      Serial.println(F("Resuming"));
    } else {
      Serial.println(F("Not Playing!"));
    }

  } else if(key_command == 't') {
    int8_t teststate = MP3player.enableTestSineWave(126);
    if(teststate == -1) {
      Serial.println(F("Un-Available while playing music or chip in reset."));
    } else if(teststate == 1) {
      Serial.println(F("Enabling Test Sine Wave"));
    } else if(teststate == 2) {
      MP3player.disableTestSineWave();
      Serial.println(F("Disabling Test Sine Wave"));
    }

  } else if(key_command == 'S') {
    Serial.println(F("Current State of VS10xx is."));
    Serial.print(F("isPlaying() = "));
    Serial.println(MP3player.isPlaying());

    Serial.print(F("getState() = "));
    switch (MP3player.getState()) {
    case uninitialized:
      Serial.print(F("uninitialized"));
      break;
    case initialized:
      Serial.print(F("initialized"));
      break;
    case deactivated:
      Serial.print(F("deactivated"));
      break;
    case loading:
      Serial.print(F("loading"));
      break;
    case ready:
      Serial.print(F("ready"));
      break;
    case playback:
      Serial.print(F("playback"));
      break;
    case paused_playback:
      Serial.print(F("paused_playback"));
      break;
    case testing_memory:
      Serial.print(F("testing_memory"));
      break;
    case testing_sinewave:
      Serial.print(F("testing_sinewave"));
      break;
    }
    Serial.println();

   } else if(key_command == 'b') {
    Serial.println(F("Playing Static MIDI file."));
    MP3player.SendSingleMIDInote();
    Serial.println(F("Ended Static MIDI file."));

#if !defined(__AVR_ATmega32U4__)
  } else if(key_command == 'm') {
      uint16_t teststate = MP3player.memoryTest();
    if(teststate == -1) {
      Serial.println(F("Un-Available while playing music or chip in reset."));
    } else if(teststate == 2) {
      teststate = MP3player.disableTestSineWave();
      Serial.println(F("Un-Available while Sine Wave Test"));
    } else {
      Serial.print(F("Memory Test Results = "));
      Serial.println(teststate, HEX);
      Serial.println(F("Result should be 0x83FF."));
      Serial.println(F("Reset is needed to recover to normal operation"));
    }

  } else if(key_command == 'e') {
    uint8_t earspeaker = MP3player.getEarSpeaker();
    if(earspeaker >= 3){
      earspeaker = 0;
    } else {
      earspeaker++;
    }
    MP3player.setEarSpeaker(earspeaker); // commit new earspeaker
    Serial.print(F("earspeaker to "));
    Serial.println(earspeaker, DEC);

  } else if(key_command == 'r') {
    MP3player.resumeMusic(2000);

  } else if(key_command == 'R') {
    MP3player.stopTrack();
    MP3player.vs_init();
    Serial.println(F("Reseting VS10xx chip"));

  } else if(key_command == 'g') {
    int32_t offset_ms = 20000; // Note this is just an example, try your own number.
    Serial.print(F("jumping to "));
    Serial.print(offset_ms, DEC);
    Serial.println(F("[milliseconds]"));
    result = MP3player.skipTo(offset_ms);
    if(result != 0) {
      Serial.print(F("Error code: "));
      Serial.print(result);
      Serial.println(F(" when trying to skip track"));
    }

  } else if(key_command == 'k') {
    int32_t offset_ms = -1000; // Note this is just an example, try your own number.
    Serial.print(F("moving = "));
    Serial.print(offset_ms, DEC);
    Serial.println(F("[milliseconds]"));
    result = MP3player.skip(offset_ms);
    if(result != 0) {
      Serial.print(F("Error code: "));
      Serial.print(result);
      Serial.println(F(" when trying to skip track"));
    }

  } else if(key_command == 'O') {
    MP3player.end();
    Serial.println(F("VS10xx placed into low power reset mode."));

  } else if(key_command == 'o') {
    MP3player.begin();
    Serial.println(F("VS10xx restored from low power reset mode."));

  } else if(key_command == 'D') {
    uint16_t diff_state = MP3player.getDifferentialOutput();
    Serial.print(F("Differential Mode "));
    if(diff_state == 0) {
      MP3player.setDifferentialOutput(1);
      Serial.println(F("Enabled."));
    } else {
      MP3player.setDifferentialOutput(0);
      Serial.println(F("Disabled."));
    }

  } else if(key_command == 'V') {
    MP3player.setVUmeter(1);
    Serial.println(F("Use "No line ending""));
    Serial.print(F("VU meter = "));
    Serial.println(MP3player.getVUmeter());
    Serial.println(F("Hit Any key to stop."));

    while(!Serial.available()) {
      union twobyte vu;
      vu.word = MP3player.getVUlevel();
      Serial.print(F("VU: L = "));
      Serial.print(vu.byte[1]);
      Serial.print(F(" / R = "));
      Serial.print(vu.byte[0]);
      Serial.println(" dB");
      delay(1000);
    }
    Serial.read();

    MP3player.setVUmeter(0);
    Serial.print(F("VU meter = "));
    Serial.println(MP3player.getVUmeter());

  } else if(key_command == 'T') {
    uint16_t TrebleFrequency = MP3player.getTrebleFrequency();
    Serial.print(F("Former TrebleFrequency = "));
    Serial.println(TrebleFrequency, DEC);
    if (TrebleFrequency >= 15000) { // Range is from 0 - 1500Hz
      TrebleFrequency = 0;
    } else {
      TrebleFrequency += 1000;
    }
    MP3player.setTrebleFrequency(TrebleFrequency);
    Serial.print(F("New TrebleFrequency = "));
    Serial.println(MP3player.getTrebleFrequency(), DEC);

  } else if(key_command == 'E') {
    int8_t TrebleAmplitude = MP3player.getTrebleAmplitude();
    Serial.print(F("Former TrebleAmplitude = "));
    Serial.println(TrebleAmplitude, DEC);
    if (TrebleAmplitude >= 7) { // Range is from -8 - 7dB
      TrebleAmplitude = -8;
    } else {
      TrebleAmplitude++;
    }
    MP3player.setTrebleAmplitude(TrebleAmplitude);
    Serial.print(F("New TrebleAmplitude = "));
    Serial.println(MP3player.getTrebleAmplitude(), DEC);

  } else if(key_command == 'B') {
    uint16_t BassFrequency = MP3player.getBassFrequency();
    Serial.print(F("Former BassFrequency = "));
    Serial.println(BassFrequency, DEC);
    if (BassFrequency >= 150) { // Range is from 20hz - 150hz
      BassFrequency = 0;
    } else {
      BassFrequency += 10;
    }
    MP3player.setBassFrequency(BassFrequency);
    Serial.print(F("New BassFrequency = "));
    Serial.println(MP3player.getBassFrequency(), DEC);

  } else if(key_command == 'C') {
    uint16_t BassAmplitude = MP3player.getBassAmplitude();
    Serial.print(F("Former BassAmplitude = "));
    Serial.println(BassAmplitude, DEC);
    if (BassAmplitude >= 15) { // Range is from 0 - 15dB
      BassAmplitude = 0;
    } else {
      BassAmplitude++;
    }
    MP3player.setBassAmplitude(BassAmplitude);
    Serial.print(F("New BassAmplitude = "));
    Serial.println(MP3player.getBassAmplitude(), DEC);

  } else if(key_command == 'M') {
    uint16_t monostate = MP3player.getMonoMode();
    Serial.print(F("Mono Mode "));
    if(monostate == 0) {
      MP3player.setMonoMode(1);
      Serial.println(F("Enabled."));
    } else {
      MP3player.setMonoMode(0);
      Serial.println(F("Disabled."));
    }
#endif

  } else if(key_command == 'h') {
    help();
  }

  // print prompt after key stroke has been processed.
  Serial.print(F("Time since last command: "));  
  Serial.println((float) (millis() -  millis_prv)/1000, 2);  
  millis_prv = millis();
  Serial.print(F("Enter s,1-9,+,-,>, or <] to increment or decrement play speed by 1 factor"));
  Serial.println(F(" [i] retrieve current audio information (partial list)"));
  Serial.println(F(" [p] to pause."));
  Serial.println(F(" [t] to toggle sine wave test"));
  Serial.println(F(" [S] Show State of Device."));
  Serial.println(F(" [b] Play a MIDI File Beep"));
#if !defined(__AVR_ATmega32U4__)
  Serial.println(F(" [e] increment Spatial EarSpeaker, default is 0, wraps after 4"));
  Serial.println(F(" [m] perform memory test. reset is needed after to recover."));
  Serial.println(F(" [M] Toggle between Mono and Stereo Output."));
  Serial.println(F(" [g] Skip to a predetermined offset of ms in current track."));
  Serial.println(F(" [k] Skip a predetermined number of ms in current track."));
  Serial.println(F(" [r] resumes play from 2s from begin of file"));
  Serial.println(F(" [R] Resets and initializes VS10xx chip."));
  Serial.println(F(" [O] turns OFF the VS10xx into low power reset."));
  Serial.println(F(" [o] turns ON the VS10xx out of low power reset."));
  Serial.println(F(" [D] to toggle SM_DIFF between inphase and differential output"));
  Serial.println(F(" [V] Enable VU meter Test."));
  Serial.println(F(" [B] Increament bass frequency by 10Hz"));
  Serial.println(F(" [C] Increament bass amplitude by 1dB"));
  Serial.println(F(" [T] Increament treble frequency by 1000Hz"));
  Serial.println(F(" [E] Increament treble amplitude by 1dB"));
#endif
  Serial.println(F(" [h] this help"));
}


5.Upload the Code.


6.Open the serial monitor with the baudrate 115200, with the commands you can control it what you want.


Availability

In Stock: 3

Usually ships in:

2-3d.gif


Customer Reviews:

There are yet no reviews for this product.
Please log in to write a review.




HUSKYLENS - An Easy-to-use AI Machine Vision Sensor
HUSKYLENS - An Easy-to-use AI Machine Vision Sensor
SG$79.00

Heart Rate and SpO2 Sensor with MAX30102
Heart Rate and SpO2 Sensor with MAX30102
SG$9.70

MP3 Shield for arduino with VS1053 module
MP3 Shield for arduino with VS1053 module
SG$23.70

Raspberry Pi 4 Starter Kit
Raspberry Pi 4 Starter Kit
SG$109.00

RoboClaw 2x15A Motor Controller w/ decoders
RoboClaw 2x15A Motor Controller w/ decoders
SG$143.00

Continuous Rotation Servo 15kg.cm Metal Gears w/ Analog Feedback
Continuous Rotation Servo 15kg.cm Metal Gears w/ Analog Feedback
SG$27.50

Camera Module Extension Cable for OpenMV Cam
Camera Module Extension Cable for OpenMV Cam
SG$15.70

3MM BRASS COUPLING FOR 48MM STEEL MECANUM WHEEL
3MM BRASS COUPLING FOR 48MM STEEL MECANUM WHEEL
SG$2.90

48MM STEEL MECANUM WHEELS SET( 2 LEFT, 2 RIGHT)
48MM STEEL MECANUM WHEELS SET( 2 LEFT, 2 RIGHT)
SG$67.00

ROBOTIS ENGINEER Kit 1
ROBOTIS ENGINEER Kit 1
SG$0.00

Robotis DREAM II series
Robotis DREAM II series
SG$0.00

Turbidity sensor Module
Turbidity sensor Module
SG$17.70

Touch Board Starter Kit
Touch Board Starter Kit
SG$217.00

Touch Board
Touch Board
SG$126.00

Electric Paint 10ml
Electric Paint 10ml
SG$15.00

Digital Metal Gear Ultra High Torque Robot Servo 120 kg.cm / 280
Digital Metal Gear Ultra High Torque Robot Servo 120 kg.cm / 280
SG$79.00

12V 100mm Stroke Electric Linear Actuator 20mm/S 50KG
12V 100mm Stroke Electric Linear Actuator  20mm/S 50KG
SG$59.70

Socket Adapter for 8Pin NRF24L01+ Wireless Transceive​rs
Socket Adapter for 8Pin NRF24L01+ Wireless Transceive​rs
SG$1.50

Circuit Playground Express
Circuit Playground Express
SG$41.70

Servos Bracket Sensor Mount Kit for Standard Servo
Servos Bracket Sensor Mount Kit for Standard Servo
SG$5.00

Resistor Pack - 1/4W - 10 values x 10 pcs - 100PCs
Resistor Pack - 1/4W - 10 values x 10 pcs - 100PCs
SG$2.70

OpenMV Cam H7 - New
OpenMV Cam H7 - New
SG$99.70

M5Stack ESP32 Camera Module Development Board with OV2640 Camera
M5Stack ESP32 Camera Module Development Board with OV2640 Camera
SG$27.70

ESP8266 ESP-01 Adaptor Module 3.3V/5V
ESP8266 ESP-01 Adaptor Module 3.3V/5V
SG$2.70

7 inch HDMI Display with Capacitive Touchscreen
7 inch HDMI Display with Capacitive Touchscreen
SG$99.50

micro: Maqueen micro:bit Robot Platform (excl. micro:bit)
micro: Maqueen micro:bit Robot Platform (excl. micro:bit)
SG$39.90

Beetle ESP32 Microcontroller
Beetle ESP32 Microcontroller
SG$23.70

Multi-Hub Wheel w/Inserts for 3mm / 4mm Shafts - 80×10mm, Black,
Multi-Hub Wheel w/Inserts for 3mm / 4mm Shafts - 80×10mm, Black,
SG$11.70

Zumo 32U4 Robot (Assembled with 75:1 HP Motors)
Zumo 32U4 Robot (Assembled with 75:1 HP Motors)
SG$194.00

NRF24L01Wireless Transceiver Module
NRF24L01Wireless Transceiver Module
SG$3.50

Analog TDS (Water Total Dissolved Solids) Sensor for Arduino
Analog TDS (Water Total Dissolved Solids) Sensor for Arduino
SG$22.50

EeonTex Conductive Fabric
EeonTex Conductive Fabric
SG$24.50

TCA9548A I2C Multiplexer
TCA9548A I2C Multiplexer
SG$9.90

FireBeetle Covers-24×8 LED Matrix (Red)
FireBeetle Covers-24×8 LED Matrix (Red)
SG$22.70

Analog Heart Rate Monitor Sensor (ECG) For Arduino
Analog Heart Rate Monitor Sensor (ECG) For Arduino
SG$29.70

TF Mini LiDAR(ToF) Laser Range Sensor
TF Mini LiDAR(ToF) Laser Range Sensor
SG$59.70

FireBeetle Covers-Camera&Audio Media Board
FireBeetle Covers-Camera&Audio Media Board
SG$29.70

Maker UNO Edu Kit (Arduino Compatible)
Maker UNO Edu Kit (Arduino Compatible)
SG$18.70

Arduino UNO + 14 I/O LEDs + speaker
Arduino UNO + 14 I/O LEDs + speaker
SG$9.70

Saleae Logic Pro 16 - 16 Channels Logic + Analog - Black
Saleae Logic Pro 16 - 16 Channels Logic + Analog - Black
SG$1 597.00

VL53L1X Time-of-Flight Mini Lidar, range 4m
VL53L1X Time-of-Flight Mini Lidar, range 4m
SG$16.90

Tic T500 Stepper Motor Controller - USB, Serial, I2C, analog, RC
Tic T500 Stepper Motor Controller - USB, Serial, I2C, analog, RC
SG$28.50

Digital Discovery: Portable Logic Analyzer and Digital Pattern G
Digital Discovery: Portable Logic Analyzer and Digital Pattern G
SG$318.50

OpenScope MZ Acrylic Case
OpenScope MZ Acrylic Case
SG$19.70

OpenScope MZ: Open-source All-in-one Instrumentation
OpenScope MZ: Open-source All-in-one Instrumentation
SG$129.50

FireBeetle ESP32 IOT Microcontroller (Supports Wi-Fi & Bluetooth
FireBeetle ESP32 IOT Microcontroller (Supports Wi-Fi & Bluetooth
SG$28.70

FireBeetle Board-328P with BLE4.1
FireBeetle Board-328P with BLE4.1
SG$28.70

FireBeetle Covers-Gravity I/O Expansion Shield
FireBeetle Covers-Gravity I/O Expansion Shield
SG$11.70

FireBeetle Covers - DC Motor & Stepper Driver
FireBeetle Covers - DC Motor & Stepper Driver
SG$21.70

Latest Raspberry Pi 3 - Model B+ - 1.4GHz Cortex-A53 with 1GB RA
Latest Raspberry Pi 3 - Model B+ - 1.4GHz Cortex-A53 with 1GB RA
SG$52.00

Metal DC Geared Motor w/Encoder - 12V 122RPM 38Kg.cm
Metal DC Geared Motor w/Encoder - 12V 122RPM 38Kg.cm
SG$47.70

DC 24V 12000RPM High Speed Large Torque 775 Motor
DC 24V 12000RPM High Speed Large Torque 775 Motor
SG$23.70

Reversible High torque Worm Gear DC Motor 12V 10RPM
Reversible High torque Worm Gear DC Motor 12V 10RPM
SG$19.90

Analog EMG Sensor to measure neural signal
Analog EMG Sensor to measure neural signal
SG$55.70

2A Motor Driver Shield
2A Motor Driver Shield
SG$16.70

AMG8833 IR Thermal Camera Breakout
AMG8833 IR Thermal Camera Breakout
SG$67.70

TURTLEBOT 3 Burger
TURTLEBOT 3 Burger
SG$0.00

SparkFun moto:bit
SparkFun moto:bit
SG$23.50

micro:bit Go Bundle
micro:bit Go Bundle
SG$26.50

Dual Channel 30A DC Motor Driver for RC, Analog, PWM, and Serial
Dual Channel 30A DC Motor Driver for RC, Analog, PWM, and Serial
SG$98.70

Dual Channel 10A DC Motor Driver for RC, Analog, PWM, and Serial
Dual Channel 10A DC Motor Driver for RC, Analog, PWM, and Serial
SG$66.50

Dual Channel 10A DC Motor Driver
Dual Channel 10A DC Motor Driver
SG$27.70

Official Raspberry Pi International PSU with UK, Euro, US and Au
Official Raspberry Pi International PSU with UK, Euro, US and Au
SG$15.70

Saleae Logic Pro 8 - 8 Channels Logic + Analog - Black
Saleae Logic Pro 8 - 8 Channels Logic + Analog - Black
SG$1 087.00

Products Categories

We Accept


 


Shopping Cart

Your Cart is currently empty.

NOTE..


-> NO GST -> NO GST -> NO GST

Product Search



Advanced Search

Featured Products

Diffused 3mm Green LED - 10pcs
Diffused 3mm Green LED - 10pcs


Socket Cap Screw M4x16-Button Head (50-Pack)
Socket Cap Screw M4x16-Button Head (50-Pack)


Copper Foil Tape - 5mm x 30m roll
Copper Foil Tape - 5mm x 30m roll


Innovati CMD Board
Innovati CMD Board


OpenMV Cam - Pan and Tilt Shield
OpenMV Cam - Pan and Tilt Shield


4MM ALUMINUM MOUNTING HUB FOR 60MM MECANUM WHEEL
4MM ALUMINUM MOUNTING HUB FOR 60MM MECANUM WHEEL


Audio Jack 3.5mm
Audio Jack 3.5mm


ProtoSnap - LilyPad Development Board
ProtoSnap - LilyPad Development Board


Arduino UNO + 14 I/O LEDs + speaker
Arduino UNO + 14 I/O LEDs + speaker


FireBeetle ESP32 IOT Microcontroller (Supports Wi-Fi & Bluetooth
FireBeetle ESP32 IOT Microcontroller (Supports Wi-Fi & Bluetooth


Currency Selector




HTTPS Secure