Selasa, 06 Agustus 2013

Skema Arduino Sensor Shield V5.0

 

arduino-sensor-shield-v5.jpg

Arduino sensor shield v5.0 merupakan salah satu shield arduino yang berfungsi untuk menghubungkan board arduino dengan modul elektronik maupun sensor yang akan digunakan.

interface yang didukung:

  • IIC interface
  • Servo controller
  • Bluetooth module
  • SD card module
  • APC220 radio frequency
  • RB URF v1.1 ultrasonic sensor
  • 12864 LCD serial dan parallel

Untuk dapat menggunakan sensor shield tersebut, kita perlu memahami skema bagaimana interface-interface tersebut terhubung dengan port-port pada board arduino.

berikut ini adalah gambar skema dari arduino sensor shield v5.0

arduino-sensor-shield

Senin, 05 Agustus 2013

Membuat Robot Rover Self avoiding


self avoiding robot rover
Tutorial kali ini akan dijelaskan tentang bagaimana cara membuat robot jenis rover yang dapat menghindari penghalang secara otomatis.
Bahan-bahan:
  • baterai x8
  • motor gearbox + roda X4
  • 4xAA baterai holder x2
  • saklar
  • kabel
  • arduino uno
  • dual l293d motor shield
  • microservo
  • hc-sr04 ultrasonic sensor

cara merakit:
  • hubungkan servo dengan konektor servo di serv0.
  • rakit 2 motor secara pararel kemudian hubungkan masing_masing pasangan motor dengan M1 dan M3.
  • hubungkan baterai holder dengan saklar, kemudian hubungkan dengan konektor eksternal power pada motor shield. 
  • hubungkan ultrasonic sensor pada motor shield (trig ke a5, echo ke a4, vcc ke 5v, grnd ke ground).
  • download program robot pada arduino uno.
  • satukan motor shield dengan arduino.

kode program:
#include <AFMotor.h>
#include <Servo.h>
#include <Ultrasonic.h>
typedef enum {
  RADAR_LEFT = 0, RADAR_CENTER = 60, RADAR_RIGHT = 120 } RadarDirection;
Servo radarServo;  // create servo object to control a servo
int RADAR_INPUT_PIN = 9;
int RADAR_MOVEMENT_DELAY = 250;
int RADAR_DISTANCE_MINIMAL_IN_CM = 80; // centimeter
int RADAR_DISTANCE_UNKNOWN_IN_CM = 0; // centimeter
int RADAR_DISTANCE_UNDEFINED = -1;
Ultrasonic radarUltrasonic(A5,A4);
AF_DCMotor motorLeft(3, MOTOR12_64KHZ); // create motor #2, 64KHz pwm
AF_DCMotor motorRight(1, MOTOR12_64KHZ); // create motor #1, 64KHz pwm
int MOTOR_SPEED = 200;// 150;
int MOTOR_TURN_SPEED = 200; //250;
int MOTOR_DELAY = 150;
int MOTOR_TURN_DELAY = 500;
int MOTOR_BACKWARD_DELAY = 1000;
struct RobotState {
  int leftMotorDirection;
  int rightMotorDirection;
  int leftMotorSpeed;
  int rightMotorSpeed;
  int motorDelay;
  boolean isBackwardState;
};
struct RadarDistances {
  int left;
  int center;
  int right;
};
RobotState forwardState = {
  FORWARD,FORWARD,MOTOR_SPEED,MOTOR_SPEED,MOTOR_DELAY,false};
RobotState backwardState = {
  BACKWARD,BACKWARD,MOTOR_SPEED,MOTOR_SPEED,MOTOR_BACKWARD_DELAY,true};
RobotState backwardUturnState = {
  FORWARD,BACKWARD,MOTOR_SPEED,MOTOR_SPEED,MOTOR_TURN_DELAY,true};
RobotState turnLeftState = {
  RELEASE,FORWARD,MOTOR_SPEED,MOTOR_TURN_SPEED,MOTOR_TURN_DELAY,false};
RobotState turnRightState = {
  FORWARD,RELEASE,MOTOR_TURN_SPEED,MOTOR_SPEED,MOTOR_TURN_DELAY,false};
RobotState stopState = {
  RELEASE,RELEASE,MOTOR_SPEED,MOTOR_SPEED,MOTOR_BACKWARD_DELAY,false};
RobotState currentState = forwardState;
RadarDistances currentDistances = {
  RADAR_DISTANCE_UNDEFINED,RADAR_DISTANCE_UNDEFINED,RADAR_DISTANCE_UNDEFINED};
RadarDistances lastDistances = {
  RADAR_DISTANCE_UNDEFINED,RADAR_DISTANCE_UNDEFINED,RADAR_DISTANCE_UNDEFINED};
void setup() {
  initTrace();
  initRadar();
  initMotors();
}
void initTrace(){
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("My First Robot");
}
void initRadar(){
  radarServo.attach(RADAR_INPUT_PIN);  // attaches the servo on pin RADAR_INPUT_PIN to the servo object
  radarServo.write(RADAR_CENTER);
}
void initMotors(){
  motorLeft.setSpeed(MOTOR_SPEED);     // set the speed to 200/255
  motorRight.setSpeed(MOTOR_SPEED);     // set the speed to 200/255
}
void loop() {
  calculateRobotState();
  makeDistancesSnapshot();
  go();
}
void calculateRobotState(){
  measureDistanceAhead();
  if(
    isCenterDistanceUndefinded() ||
    isNoObstacleInPathAhead())
  {
//    if(isInCorner()){
//      currentState = backwardState; 
//      return;
//    }
    currentState = forwardState; 
    return;
  }
  measureDistanceLeft();
  measureDistanceRight();
  if(greater(currentDistances.left,currentDistances.right)){
    currentState = turnLeftState; 
    return;
  }
  if(greater(currentDistances.right,currentDistances.left)){
    currentState = turnRightState; 
    return;
  }
  if(eq(currentDistances.left,currentDistances.right)){
    currentState = backwardState; 
    return;
  }
  currentState = stopState;
}
void go(){
  Serial.print("Go : { ");
  Serial.print(currentState.leftMotorDirection);
  Serial.print(" , ");
  Serial.print(currentState.rightMotorDirection);
  Serial.println(" }");
  Serial.print("with : { left:");
  Serial.print(currentDistances.left);
  Serial.print(" , center:");
  Serial.print(currentDistances.center);
  Serial.print(" , right:");
  Serial.print(currentDistances.right);
  Serial.println(" }");
  motor();
}
void motor(){
  motorLeft.setSpeed(currentState.leftMotorSpeed);
  motorRight.setSpeed(currentState.rightMotorSpeed);
  motorLeft.run(currentState.leftMotorDirection);
  motorRight.run(currentState.rightMotorDirection);
  if(currentState.isBackwardState){
    delay(currentState.motorDelay);
    motorLeft.setSpeed(backwardUturnState.leftMotorSpeed);
    motorRight.setSpeed(backwardUturnState.rightMotorSpeed);
    motorLeft.run(backwardUturnState.leftMotorDirection);
    motorRight.run(backwardUturnState.rightMotorDirection);
    delay(backwardUturnState.motorDelay);
  }
}
void measureDistanceLeft(){
  moveRadarFastTo(RADAR_LEFT);
  currentDistances.left = internalMeasure();
}
void measureDistanceRight(){
  moveRadarFastTo(RADAR_RIGHT);
  currentDistances.right = internalMeasure();
}
void measureDistanceAhead(){
  moveRadarFastTo(RADAR_CENTER);
  currentDistances.center = internalMeasure();
}
int internalMeasure(){
  long microsec = radarUltrasonic.timing();
  return radarUltrasonic.convert(microsec, Ultrasonic::CM);
}
void moveRadarFastTo(int radarServoPosition){
  radarServo.write(radarServoPosition);              // tell servo to go to position in variable 'pos'
  delay(RADAR_MOVEMENT_DELAY);
}
boolean isCenterDistanceUndefinded(){
  return currentDistances.center == RADAR_DISTANCE_UNKNOWN_IN_CM;
}
boolean isNoObstacleInPathAhead(){
  return currentDistances.center >= RADAR_DISTANCE_MINIMAL_IN_CM;
}
boolean isInCorner(){
  boolean left = eq(currentDistances.left,lastDistances.left);
  boolean center = eq(currentDistances.center,lastDistances.center);
  boolean right = eq(currentDistances.right,lastDistances.right);
  return left && center && right;
}
boolean eq(int a, int b){
  int epsilon = 5;
  int diff = a - b;
  diff = diff < 0 ? (-1)*diff : diff;
  return diff <= epsilon ? true : false;
}
boolean greater(int a, int b){
  int epsilon = 5;
  int diff = a - b;
  if(diff > 0){
    diff = diff - epsilon;
  }
  return diff > 0;
}
void makeDistancesSnapshot(){
  lastDistances.left = currentDistances.left;
  lastDistances.center = currentDistances.center;
  lastDistances.right = currentDistances.right;
}
 
video robot rover 4 roda:

video robot 2 roda:



























Sabtu, 03 Agustus 2013

Arduino L293D Motor Drive Shield

 

arduino dual l293d motor shield

Dual l293d motor shield, merupakan shield arduino yang mudah penggunaannya untuk pembuatan aplikasi robot beroda. Karena shield ini dapat menjalankan 4 buah motor dan dua buah servo sekaligus. Shield ini adalah produk buatan dari adafruit. Namun dipasaran, sudah banyak beredar produk yang serupa (clone) dengan harga yang lebih murah.

Spesifikasi lengkap shield ini adalah sebagai berikut.

-2 konektor untuk 5V Servo.
- Dapat menjalankan 4 motor DC atau 2 stepper motor atau 2 Servo.
- Dapat menjalankan 4 motor bi-directional DC dengan kecepatan pemilihan 8-bit.
- Menjalankan 2 stepper motor (unipolar atau bipolar) dengan single coil atau double coil.
- 4 H-Bridges: per bridge menyediakan 0.6A (1.2A saat puncak) dengan perlindungan termal, dapat menjalankan motor  4.5V sampai 36V DC.
- Tombol reset.
- 2 konektor daya eksternal.
- Kompatibel untuk Uno, Mega Diecimila & Duemilanove.

Untuk file librarynya bisa mendownload di link di bawah ini.

arduino motor shield library

contoh program

1. Motor_shield_test_01

#include <AFMotor.h>

AF_DCMotor motor(2, MOTOR12_64KHZ); // create motor #2, 64KHz pwm

void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Motor test!");
  motor.setSpeed(200);     // set the speed to 200/255
}

void loop() {
  Serial.print("tick");
  motor.run(FORWARD);      // turn it on going forward
  delay(1000);

  Serial.print("tock");
  motor.run(BACKWARD);     // the other way
  delay(1000);


  Serial.print("tack");
  motor.run(RELEASE);      // stopped
  delay(1000);
}

 

2. Motor_shield_test_02

#include <AFMotor.h>

AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);

void setup()
{
  motor1.setSpeed(100); 
  motor2.setSpeed(100); 
  motor3.setSpeed(100); 
  motor4.setSpeed(100);
}
void loop()
{
  motor1.run(FORWARD); 
  motor2.run(FORWARD); 
  motor3.run(FORWARD); 
  motor4.run(FORWARD);
  ::delay(5000);
  motor1.run(RELEASE);
  motor2.run(RELEASE); 
  motor3.run(RELEASE); 
  motor4.run(RELEASE); 
  ::delay(5000);
}

Jumat, 17 Mei 2013

HC-SR04 ultrasonic sensor test

 

HC-SR04 merupakan sensor ultrasonic untuk mendeteksi jarak.

spesifikasi:

voltase :5V DC (high), 0V DC (low)
arus kerja : <2mA
sudut efektif: <15°
jarak efektif : 2cm – 500 cm
ketelitian : 0.3 cm

jumlah pin 4 buah, yaitu VCC,TRIG,ECHO,GND

Untuk melakukan test pada HC-SR04 kita buat rangkain sebagai berikut:

ping test

kemudian kita download program pada arduino:

/*
HC-SR04 Ping distance sensor]
VCC to arduino 5v GND to arduino GND
Echo to Arduino pin 13 Trig to Arduino pin 12
Red POS to Arduino pin 11
Green POS to Arduino pin 10
560 ohm resistor to both LED NEG and GRD power rail
More info at: http://goo.gl/kJ8Gl
Original code improvements to the Ping sketch sourced from Trollmaker.com
Some code and wiring inspired by http://en.wikiversity.org/wiki/User:Dstaub/robotcar
*/

#define trigPin 13
#define echoPin 12
#define led 11
#define led2 10

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
  long duration, distance;
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
//  delayMicroseconds(1000); - Removed this line
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 4) {  // This is where the LED On/Off happens
    digitalWrite(led,HIGH); // When the Red condition is met, the Green LED should turn off
  digitalWrite(led2,LOW);
}
  else {
    digitalWrite(led,LOW);
    digitalWrite(led2,HIGH);
  }
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}

 

Untuk mengetahui jarak pengukuran kita hubungkan arduino dengan komputer menggunakan kabel usb kemudian pilih menu serial monitor pada software arduino.

 

video hasil pengujian:

 

Sabtu, 04 Mei 2013

Simple Hexapod

 

Hexapod adalah jenis robot berkaki, ia memiliki jumlah kaki sebanyak enam buah. Hexapod bisa dibuat dibuat dengan struktur yang paling sederhana hingga yang paling rumit. Dan kali ini kita akan membuat robot Hexapod sederhana hanya dengan sebuah motor listrik dan juga stick eskrim. Oleh karena itu dalam membuatnya tidak diperlukan biaya yang terlalu mahal.

Pertama-tama kita memerlukan motor listrik yang sudah dilengkapi dengan gearbox dan juga backshaft. Motor listrik jenis ini biasanya digunakan untuk pembuatan robot beroda.

-font-b-Micro-b-font-DC-6V-triaxial-TT-font-b-gear-b-font-font

Selain itu kita memerlukan saklar, kabel dan sumber tenaga berupa power bank. Kita bisa menggunakan baterai biasa untuk menggantikan powerbank. Saya menggunakan powerbank karena pertimbangan biaya operasional yang lebih murah karena bisa diisi ulang. Untuk kerangka robotnya saya hanya menggunakan stick eskrim tusuk gigi dan lem kayu.

Struktur kerangka robot

hexapod schematic system 

Detail robot yang saya buat

IMG_20130503_123750 IMG_20130503_123807

IMG_20130503_123827 PICT0084

PICT0085 PICT0086

PICT0087 PICT0088

 

berikut ini video cara kerja robot

Rabu, 01 Mei 2013

Pengaman Back-EMF

 

Back Electro-Motive Force (Back-EMF) menggambarkan energi yang harus dibuang
ketika medan elektro-magnetik berhenti dari induktor. Hal ini terjadi setiap kali motor
berhenti atau berubahan arah. Jika tegangan tidak dapat keluar melalui dioda pengaman, hal itu dapat merusak transistor yang tidak terlindungi dan mungkin saja bisa merusak pin Arduino yang mengontrolnya.

Oleh karena itu agar Back-EMF tidak merusak arduino. Kita bisa membuat rangkaian pengamannya dengan 4 buah dioda yang disolder pada motor listrik. Langkah membuatnya akan dijelaskan dengan gambar.

gambar rangkaian dioda

 dioda

Hubungkan kaki-kaki dioda, bisa juga disolder

Solder rangkaian pada motor listrik.

Solder kabel sebagai penghubung ke sumber arus. Agar lebih kuat bisa kita gunakan lem bakar/glue gun pada ragkaian.

Selasa, 30 April 2013

Speaker dari Hardisk Bekas

 

Jika di rumah memiliki hardisk rusak, jangan buru-buru dibuang. Kita masih bisa menggunakannya untuk “bermain-main”. Kali ini kita akan murubah sebuah hardisk menjadi sebuah speaker.

Ok, langsung saja kita praktekkan daripada penasaran.

Pertama-tama kita kita perlu membongkar hardisk bekas yang sudah tidak terpakai/rusak. Untuk membukanya kita memerlukan obeng dengan mata obeng berbentuk bintang dengan ukuran T8 dan T7.

letak baut

IMG_20130428_081844

gambar bagian dalam hardisk:

IMG_20130428_082402

Hilangkan bagian yang diberi tanda panah dan juga bagian piringan hardisk. Untuk mengangkat bagian piringan hardisk kita gunakan mata obeng ukuran T7.

 

Angkat magnet agar kita bisa mengambil lengan pembaca. Hati-hati dalam mengangkat magnet karena magnet dalam hardisk sangat-sangat kuat. Kalau tidak hati-hati tangan bisa terjepit.

Setelah itu kita solder bagian lengan pembaca dengan dua buah kabel.

Jika sudah kita tempatkan lengan pembaca dan magnet seperti semula.

IMG_20130428_083338

Terakhir, kita hubungkan kabel dengan amplifier atau dengan arduino seperti pada proyek sebelumnaya (Memainkan Ringtone pada Arduino).

video hasil tutorial

Minggu, 28 April 2013

Mengambil Screenshot dari Layar Android

 

Bagi hp android terbaru mulai generasi 4.0 atau ice cream sandwich dan diatasnya tidak akan kesulitan untuk mengambil gambar screenshot pada layar androidnya. Namun tidak demikian dengan generasi dibawahnya, perlu aplikasi tambahan untuk dapat melakukannya.

Ada banyak sekali aplikasi untuk mengambil screenshot di playstore google. Salah satunya adalah ascreenshoot.

gambar icon ascreenshoot

2013-04-28-10-34-57

Saya merekomendasikan ascreenshoot karena selain mudah dalam penggunaannya, ascreenshot dapat diperoleh secara gratis. Namun ada syarat tertentu sebelum menggunakan ascreenshoot. Yaitu handphone harus sudah di Root. Jika tidak maka aplikasi tidak akan berjalan sebagaimana mestinya.

Dalam mengambil gambar screenshot kita diberi pilihan cara pengambilan gambar yaitu melalui delay time, menggoyangkan handphone, melalui jendela notifikasi, menahan tombol search, dan juga melalui tombol kamera handphone.

2013-04-28-10-35-09

Kita diberi 2 pilihan format gambar yang akan disimpan yaitu .png atau .jpeg. Selain itu gambar yang diambil juga bisa diberi efek invert colour.

2013-04-28-10-35-28

Hasil gambar invert colour

2013-04-28-10-52-51 2013-04-28-10-52-35

Rabu, 24 April 2013

Modifikasi Kamera Nexian Ultra Journey NX-A891

 

Handphone nexian A-891 atau nama lainnya adalah nexian ultra journey. Adalah salah satu handphone android generasi awal dari vendor handphone s-nexian. Handphone ini dibekali dengan kamera primer 3 megapixel. Kamera dengan sensor sebesar ini sudah lebih dari cukup untuk mengabadikan momen sehari-hari maupun untuk bernarsis ria. Namun kali ini kita akan memodifikasi agar kamera dari handphone ini bisa digunakan untuk fotografi makro selain itu juga menghasilkan efek DOF atau bokeh.

Pertama tama kita siapkan peralatan yang akan kita gunakan yaitu obeng set. Untuk membongkar nexian ultra journey kita membutuhkan mata obeng plus (+) dengan ukuran 1.7.

gambar obeng set yang digunakan.

 

Kemudian  bagian yang paling penting yaitu lensa bekas dvd rom/ cd rom.

stock-footage-cd-reader-inside-view-inserting-reading-and-ejecting-the-cd-rom

Bongkar bagian yang dilingkari karena di dalamnya terdapat lensa yang kita butuhkan, Letaknya berada di depan laser dioda. (pada gambar tidak terlihat).

Kita buka casing belakang hp, kemudian kita buka baut yang berjumlah 4 buah dengan obeng. Letak baut ditunjukkan oleh tanda panah pada gambar di bawah.

Buka body handphone bagian tengah, saya menggunakan cutter sebagai bantuan karena antara casing bagian depan dan bagian tengah sangat rapat. Gunakan bagian tajam dari cutter. Hati-hati! agar tidak merusak body handphone.

Setelah sedikit terbuka telusuri bagian yang sudah terbuka dengan kuku jari atau bekas sim card sepanjang body hp.

Setelah terbuka perhatikan gambar di bawah.

Bagian yang diberi tanda panah berwarna merah merupakan karet yang melindungi kamera dari debu. Kita hilangkan bagian ini, gunakan bantuan obeng minus. Letakkan lensa bekas dvd/vcd rom di bagian dimana karet pelindung kamera sebelumnya berada.

gambar lensa dan karet pelindung kamera

gambar lensa telah terpasang di tempatnya

Langkah terakhir, rakit kembali handphone seperti semula. Selesai!

Peringatan!!! Segala kerusakan perangkat yang disebabkan karena mengikuti tutorial ini bukanlah tanggung jawab saya. Jadi sebelum anda mengikuti tutorial ini silahkan dipikirkan baik-baik segala resikonya.

contoh gambar yang diambil dengan kamera hasil modifikasi

IMG_20130414_060234

IMG_20130415_075514

IMG_20130415_150158

Selasa, 23 April 2013

Dadu Digital

 

Bermain dengan papan permainan seperti ular tangga, monopoli dan berbagai permainan yang lain memang sangat menyenangkan. Semua permainan ini memerlukan dadu sebagai syarat utama permainan. Akan tetapi, karena ukurannya yang kecil, dadu ini sering kali hilang. Padahal tanpa dadu permainan tidak bisa berjalan.

Jilka hal tersebut terjadi kita bisa membuat dadu digital dengan menggunakan beberapa buah lampu led dan arduino uno. Bahkan hasilkan labih bagus daripada dadu biasa karena saat mengacak nomor, lampu-lampu led pada dadu elektronik tersebut akan berkerlap-kerlip,  sangat menarik.

Atau bagi yang hanya iseng dan ingin belajar arduino dapat megikuti totorial kali ini karena tutorial kali ini sedikit lebih rumit daripada tutorial arduino sebelumnya.

Rangkaiannya adalah sebagai berikut:

digital dice led arduino 

Resistor yang berhubungan dengan lampu led bernilai 330 ohm sedangkan resistor yang berhubungan dengan saklar tekan bernilai 1k ohm.

Kode program arduino:

 

int ledPins[7] = {2, 3, 4, 5, 6, 7, 8};
int dicePatterns[7][7] = {
{0, 0, 0, 0, 0, 0, 1}, // 1
{0, 0, 1, 1, 0, 0, 0}, // 2
{0, 0, 1, 1, 0, 0, 1}, // 3
{1, 0, 1, 1, 0, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 1, 1, 1, 1, 1, 0}, // 6
{0, 0, 0, 0, 0, 0, 0} // BLANK
};
int switchPin = 9;
int blank = 6;
void setup()
{
for (int i = 0; i < 7; i++)
{
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
randomSeed(analogRead(0));
}
void loop()
{if (digitalRead(switchPin))
{
rollTheDice();
}
delay(100);
}
void rollTheDice()
{
int result = 0;
int lengthOfRoll = random(15, 25);
for (int i = 0; i < lengthOfRoll; i++)
{
result = random(0, 6); // result will be 0 to 5 not 1 to 6
show(result);
delay(50 + i * 10);
}
for (int j = 0; j < 3; j++)
{
show(blank);
delay(500);
show(result);
delay(500);
}
}
void show(int result)
{
for (int i = 0; i < 7; i++)
{
digitalWrite(ledPins[i], dicePatterns[result][i]);
}
}

 

Contoh video dadu digital jika sudah jadi

 

 

source: 30 arduino projects for the evil genius