Translate

Membuat Alat Kendali Angle Servo Menggunakan Leap Motion dan Arduino

Membuat Alat Kendali Angle Servo Menggunakan Leap Motion dan Arduino


          Pada siang hari ini saya akan menjelaskan project ketiga saya menggunakan Leap Motion, kali ini alat yang dibuat adalah alat untuk kendali angle servo, jadi servo akan bergerak sesuai arah / posisi tangan berada, untuk aplikasinya sangat banyak sekali seperti halnya kendali robot lengan menggunakan tangan, kendali buka-tutup pintu dengan gesture tangan, dan lain sebagainya, komponen yang dibutuhkan tidaklah banyak yaitu Arduino Uno, Servo, dan Leap Motion. Untuk lebih jelasnya berikut adalah skema dan programnya. 



a. Arduino Uno




b. Leap Motion





c. Motor Servo





d. Program Arduino IDE

#include <LiquidCrystal.h>
#include <Servo.h>

int currentRead;
Servo myservo;

LiquidCrystal lcd(8, 9, 10, 11, 12, 7);

void setup() {
  myservo.attach(6);
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.noCursor();
}

void loop() {

  if (Serial.available()) {
  currentRead = Serial.read();
  
  if (currentRead < 50)
  {
  currentRead = 50;
  } 
  if (currentRead > 200)
  {
  currentRead = 200;
  }
   
  lcd.setCursor(0, 0);
  lcd.print("Angle X = ");
  lcd.print(currentRead); 
  myservo.write(currentRead);
 
  delay(200);
  lcd.clear();
 
  }
}




e. Program Processing IDE

     // An array of LEDs lit up by LEAP motion on an ARDUINO

    // LEAP libraries
    import de.voidplus.leapmotion.*;
    LeapMotion leap;

    // Serial Port Output
    import processing.serial.*; // Serial libraries, send OUTPUT through USB
    Serial myPort;

    int ledPin;
    int checkPin;
    int ok;

    void setup() {
    size(800, 500, P3D);
    background(255);
    noStroke();
    fill(50);
    // New port object
    myPort = new Serial(this, Serial.list()[0], 9600);

    // New leap object
    leap = new LeapMotion(this);
    }

    void draw() {
    background(255);

    // Leap magic
    int fps = leap.getFrameRate();

    // Clean LEAP Hand position
    for (Hand hand : leap.getHands()) {

    hand.draw();
    PVector hand_position = hand.getPosition();
    println("Hand on X: " + hand.getPosition().x );
    ok = (int) (hand.getPosition().x);   
    myPort.write(ok);

    println("Hand on Y: " + hand.getPosition().y );
    // Determine ledPin according to mapped hand x position
    delay(200);

    }
    }
   
    void delay(int delay)
    {
    int time = millis();
    while(millis()-time<=delay);
    }
   
    void leapOnInit() {
    // println(“Leap Motion Init”);
    }
    void leapOnConnect() {
    // println(“Leap Motion Connect”);
    }
    void leapOnFrame() {
    // println(“Leap Motion Frame”);
    }
    void leapOnDisconnect() {
    // println(“Leap Motion Disconnect”);
    }
    void leapOnExit() {
    // println(“Leap Motion Exit”);
    }
 


  
 f. Cara Install Library 

 1. Buka Software Processing lalu Pilih Sketch -> Import Library -> add library
 2. Search "leapmotion" lalu Pilih seperti di gambar berikut dan INSTALL
 3. Library Siap digunakan





 

g. VIDEO HASILNYA

   
   
   







Membuat Rangkaian Flip-Flop

Membuat Rangkaian Flip-Flop


          Kali ini saya akan membuat alat dengan tema flip-flop module, berbeda dengan biasanya yang menjelaskan tentang mikrokontroller, disini akan dijelaskan penuh tentang skematik dan cara pembuatannya, ada 3 modul disini yang akan dibuat yaitu SR flip-flop, JK flip-flop, dan D flip-flop. jadi input menggunakan DIP Switch dan output menggunakan LED. berikut skemanya.



- Skema Rangkaian




* Komponen yang digunakan :
1. IC 74HC00
2. IC 74HC76
3. IC 74HC74
4. Resistor 100 ohm dan 330 ohm
5. DIP Switch
6. Led 
7. Push Button
8. Pin Header Male 





Membuat Alat Pendeteksi Jari Tangan Menggunakan Arduino dan Leap Motion

Membuat Alat Pendeteksi Jari Tangan Menggunakan Arduino dan Leap Motion


           Kali ini akan dibahas mengenai bagaimana cara membuat alat yang digunakan untuk mendeteksi jari-jari tangan kemudian jari-jari tangan tersebut dapat mengendalikan hidup dan matinya LED yang terpasang di Arduino, alat ini bisa dikembangkan untuk mengendalikan robot atau device lain seperti servo atau motor dc dll. Alat ini menggunakan sensor Leap Motion sebagai media pendeteksinya, yang akan ditransferkan ke Arduino. berikut penjelasan skema dan programnya.



 a. Arduino Uno





b. Leap Motion




 c. Program Processing IDE

import com.onformative.leap.LeapMotionP5;
import com.leapmotion.leap.Finger;
LeapMotionP5 leap;

import processing.serial.*;
Serial port;

public void setup() {
  // set window, P3D = 3D rendering
  size(600, 600, P3D);
  noFill();
  stroke(255);
 
  // set LEAP object
  leap = new LeapMotionP5(this);
 
  // set com port. Currently: "/dev/tty.usbmodemfd121"
  //println("Available serial ports:");
  //println(Serial.list());
  //port = new Serial(this, "/dev/tty.usbmodemfd121", 9600); 
  port = new Serial(this, Serial.list()[0], 9600); 
 }

public void draw() {
  background(0);
  fill(255);
  int numFingers = leap.getFingerList().size();
  print("Number of Fingers: ");
  println(numFingers);
  port.write(numFingers);
  for (Finger f : leap.getFingerList()) {
    PVector position = leap.getTip(f);
    PVector velocity = leap.getVelocity(f);
    ellipse(position.x, position.y, 10, 10);
  }
}
  
public void stop() {
  leap.stop();
 }  




d. Program Arduino IDE

void setup(){
  // initialize serial communication:
  Serial.begin(9600);
  // set LED pins 3-7 as outputs
  for(int x = 3; x<8; x++){
    pinMode(x, OUTPUT);
  }
}

void loop(){
  byte numFingers;
  // check if data has been sent from the computer:
  if (Serial.available()) {
    // read the most recent byte (which will be from 0 to 255):
    numFingers = Serial.read();
    if (numFingers == 0){
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
    } else if (numFingers == 1){
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
    } else if (numFingers == 2){
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
    } else if (numFingers == 3){
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
    } else if (numFingers == 4){
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
    } else if (numFingers == 5){
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
    }
  }
}




d. Cara Install Library

- Download library di link berikut  https://github.com/mrzl/LeapMotionP5
- Ekstrak file tersebut lalu letakan di Document -> Processing -> Libraries
- Ubah namanya menjadi "LeapMotionP5"
- Lalu buka software Processing dan Arduinonya




e. VIDEO HASILNYA









 

Membuat Alat Dengan Kendali Gesture Leap Motion & Arduino

Membuat Alat Dengan Kendali Gesture Leap Motion & Arduino


            Kali ini saya akan bercerita mengenai bagaimana cara membuat alat dengan kendali Leap Motion, jika belum tahu apa itu Leap Motion silahkan tanyakan mbah gugel atau om yutub, Leap Motion adalah alat yang digunakan untuk mendeteksi gesture tangan atau juga bisa digunakan untuk deteksi jari2 secara real time, sehingga alat ini bisa difungsikan sebagai sensor gerak, pada contoh kali ini saya menjelaskan tentang kendali 4 buah led menggunakan gesture Leap Motion, berikut program dan skemanya.



a. Arduino Uno





b. Leap Motion 





c. Program Processing IDE

    // An array of LEDs lit up by LEAP motion on an ARDUINO

    // LEAP libraries
    import de.voidplus.leapmotion.*;
    LeapMotion leap;

    // Serial Port Output
    import processing.serial.*; // Serial libraries, send OUTPUT through USB
    Serial myPort;

    int ledPin;
    int checkPin;

    void setup() {
    size(800, 500, P3D);
    background(255);
    noStroke();
    fill(50);
    // New port object
    myPort = new Serial(this, Serial.list()[0], 9600);

    // New leap object
    leap = new LeapMotion(this);
    }

    void draw() {
    background(255);

    // Leap magic
    int fps = leap.getFrameRate();

    // Clean LEAP Hand position
    for (Hand hand : leap.getHands()) {

    hand.draw();
    PVector hand_position = hand.getPosition();
     println("Hand on X: " + hand.getPosition().x );
     println("Hand on Y: " + hand.getPosition().y );
    // Determine ledPin according to mapped hand x position

    checkPin = (int) map(hand.getPosition().x, 0, 700, 8, 14);
    if (ledPin != checkPin) {
    assignPin();
    }

    // Send ledPin number through port

    }
    }
   
    void assignPin() {
    ledPin = checkPin;
    myPort.write(ledPin);
    println("Serial Output: " + ledPin);

    }
   
    void leapOnInit() {
    // println(“Leap Motion Init”);
    }
    void leapOnConnect() {
    // println(“Leap Motion Connect”);
    }
    void leapOnFrame() {
    // println(“Leap Motion Frame”);
    }
    void leapOnDisconnect() {
    // println(“Leap Motion Disconnect”);
    }
    void leapOnExit() {
    // println(“Leap Motion Exit”);
    }
   
   
   

d. Program Arduino IDE

     // Arduino sketch turn LED on via serial input from Processing

    // Define main variables
 int ledPin = 0;
 int currentRead;

    // Slowing down the process
    //unsigned long millisCounter = 0;
    //int interval = 10;

    // activate the pins I want to use on my board
 int myPins[5] = {
 9, 10, 11, 12, 13};

 void setup() {
    // Activate all Digital pins on my board
 for (int i = 0; i < 5; i++) {
 pinMode(myPins[i], OUTPUT);
    }
 Serial.begin(9600);
    }
   
 void loop() {

    if (Serial.available()) {
    currentRead = Serial.read();
    if(currentRead != ledPin) {
    digitalWrite(ledPin, LOW);
    ledPin = currentRead;
    digitalWrite(ledPin, HIGH);
    }
    }
    }
   


e. Cara Menginstal Library

- Pertama buka procssing -> sketch -> import library -> add library
- lalu pilih seperti di gambar dan install




f. VIDEO HASILNYA










JASA PEMBUATAN QUADCOPTER / DRONE SIAP TERBANG

JASA PEMBUATAN QUADCOPTER / DRONE SIAP TERBANG


        Kami menyediakan jasa pembuatan drone / quadcopter seperti Video yang ditampilkan diatas, dengan spesifikasi sebagai berikut:

1. Controller APM + IMU
2. Motor brushless
3. ESC
4. Battery Lipo
5. Propeller
6. Remote / Radio Control
7. UBEC
8. Frame standart

Harga = Rp. 7.000.000 (untuk komponen diatas)

        Jika ingin menambahkan GPS atau perangkat tambahan lainnya maka biaya akan ditambahkan sesuai dengan harga komponennya.

Berikut adalah gambar drone yang dibuat (sample)

















( MSP EXP430G2 / Arduino Project ) Temperature LM35 & Interface 7 Segment

( MSP EXP430G2 / Arduino Project ) Temperature LM35 & Interface 7 Segment

             
              Kali ini saya akan membahas mengenai bagaimana cara membuat alat dengan menggunakan board MSP EXP430G2553, ini adalah project pertama saya dengan board ini, setelah saya coba board ini ternyata hasilnya luar biasa stabil dan arus / tegangan yang dipakai tetap, selain itu saat proses upload benar2 smooth sekali, yang perlu diingat pada board Launchpad ini yaitu VCC = 3,3 volt bukan 5 volt, maka dari itu ubah Vref adc dengan 3,3 volt. Alat ini menggunakan sensor LM35 sebagai sensor temperature, kemudian interface menggunakan 7 segment CA 2 digit dan drivernya adalah IC shift register 74HC164. untuk penjelasan lebih lanjut berikut program dan skemanya.  Jika belum tau cara mem-programnya silahkan kunjungi link ini ==>> LINK 



a. Board MSP EXP430G2553




 b. Skema 7Segment Interface & LM35





 
c. Cara Memasang Sensor & 7segment

- Hubungkan CLK ke pin 7 , Data ke pin 8, Vout LM35 ke A0
- Hubungkan VCC dan GND
- Jika menggunakan Board Arduino maka sesuaikan Pin I/0 nya



d. Program Energia IDE

#define data 8
#define clock 7

byte zero  = B00000011;
byte one   = B10011111;
byte two   = B00100101;
byte three = B00001101;
byte four  = B10011001;
byte five  = B01001001;
byte six   = B01000001;
byte seven = B00011111;
byte eight = B00000001;
byte nine  = B00001001;

void setup()
{
  // put your setup code here, to run once:
  pinMode(clock, OUTPUT); // make the clock pin an output
  pinMode(data , OUTPUT); // make the data pin an output3
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  int sensorValue = analogRead(A0);
  int volt = ((sensorValue * 3.3) / 1023.0) * 100.0;
  Serial.println(volt);
 
  int puluhan = volt / 10;
  int satuan = volt % 10;
   
  //digitalWrite(9, HIGH); //satuan
  //digitalWrite(10, HIGH); //puluhan

 switch(puluhan){
   case 0:
   puluhan = zero;
   break;
   case 1:
   puluhan = one;
   break;
   case 2:
   puluhan = two;
   break;
   case 3:
   puluhan = three;
   break;
   case 4:
   puluhan = four;
   break;
   case 5:
   puluhan = five;
   break;
   case 6:
   puluhan = six;
   break;
   case 7:
   puluhan = seven;
   break;
   case 8:
   puluhan = eight;
   break;
   case 9:
   puluhan = nine;
   break;   
 }

 switch(satuan){
   case 0:
   satuan = zero;
   break;
   case 1:
   satuan = one;
   break;
   case 2:
   satuan = two;
   break;
   case 3:
   satuan = three;
   break;
   case 4:
   satuan = four;
   break;
   case 5:
   satuan = five;
   break;
   case 6:
   satuan = six;
   break;
   case 7:
   satuan = seven;
   break;
   case 8:
   satuan = eight;
   break;
   case 9:
   satuan = nine;
   break;  
 }

    digitalWrite(9, LOW); //satuan
    digitalWrite(10, HIGH); //puluhan
    shiftOut(data, clock, LSBFIRST, puluhan);
    delay(10);
    digitalWrite(9, HIGH); //satuan
    digitalWrite(10, LOW); //puluhan
    shiftOut(data, clock, LSBFIRST, satuan);
    delay(10);

}




e. VIDEO HASILNYA








Cara Mengakses MSP EXP430G2553 Ver 1.5

Cara Mengakses MSP EXP430G2553 Ver 1.5


         Malam ini saya akan menjelaskan mengenai board yang tidak asing lagi di telinga OPREXERZ... board ini sangat bagus sekali karena output tegangan GPIO adalah 3,3 volt berbeda dengan yang biasanya di AVR yang menggunakan 5 volt sebagai tegangan output, modul ini bisa di akses menggunakan berbagai macam cara, namun yang gampang disini saya akan mencontohkan dengan menggunakan ENERGIA. berikut langkah-langkahnya.

1. Download software ENERGIA di http://energia.nu/
2. Kemudian pilih OS yang digunakan
3. Setelah di download, hubungkan MSP EXP430G2553 ke komputer
4. Arahkan Driver ke Folder ENERGIA yang tadi didownload (sudah di extract)
5. Untuk pertama kali lakukanlah setting berikut

 




 6. Lakukan Upload blink.ino

#define LED RED_LED
//#define LED GREEN_LED
 
void setup() {               
  pinMode(LED, OUTPUT);    
}

void loop() {
  digitalWrite(LED, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(LED, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}


7. Lihat hasilnya, jika LED sudah berkedip berarti Lounchpad board siap digunakan
8. Lakukan step selanjutnya yaitu mengaktifkan serial dengan cara berikut
9. Rubah formasi jumper dan pastikan IC adalah G2553







 10. Jika sudah, Upload program berikut

void setup() {
  Serial.begin(9600); // msp430g2231 must use 4800
}

void loop() {
  // read the input on analog pin A3:
  int sensorValue = analogRead(A3);
  // print out the value you read:
  Serial.println(sensorValue);
  delay(1); // delay in between reads for stability
}



 11. Maka hasilnya akan sepeti berikut





12. Selamat mencoba....











Membuat Alat Penerima Radio FM Menggunakan Mikrokontroller

Membuat Alat Penerima Radio FM Menggunakan Mikrokontroller

    
                Radio FM pada jaman sekarang ini sangatlah diperlukan, seperti halnya digunakan pada toko-toko, mobil pribadi, atau juga di rumah / kos, selain untuk mendengarkan musik, radio juga berfungsi sebagai penyampai pesan, sama seperti halnya TV. Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat radio FM sederhana dengan menggunakan mikrokontroller, radio ini menggunakan modul TEA5767 yang mana dapat menerima sinyal di frekuensi 76 - 108 Mhz, untuk mengakses modul radio ini harus mengunakan i2c dan juga output modul ini harus ditambahkan audio amplifier dan speaker sendiri, untuk lebih jelasnya berikut adalah penjelasan mengenai program dan skemanya.



a. Minimum System ATMega





 b. Modul TEA5767 





c. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 12000000
$baud = 9600

$lib "mcsbyte.lbx"

Config Scl = Portc.0                                        'i2c scl
Config Sda = Portc.1                                        'i2c sda
Config I2cdelay = 10                                        ' i2c delay

Ddrd.2 = 0
Ddrd.3 = 0
Ddrd.4 = 0
Ddrd.5 = 0

Set Portd.2
Set Portd.3
Set Portd.4
Set Portd.5


'_____________________________________________
'config
Dim Address As Byte , Command As Byte                       'RC5 ir variable
Dim Pll As Single
Dim Fset As Word
Dim Freq As Single                                          ' set freq
Dim 1st As Byte
Dim 2nd As Byte
Dim 3rd As Byte
Dim 4st As Byte
Dim 5th As Byte
Const Fref = 32.768                                         ' cristal freq radio module
Const Fg = 250
I2cinit

Freq = 76
'_____________________________________________
'main program
Do

If Pind.2 = 0 Then
Waitms 200
Freq = Freq + 0.1
Print Freq

Elseif Pind.3 = 0 Then
Waitms 200
Freq = Freq - 0.1
Print Freq

End If

Pll = Freq * 1000
Pll = Pll + Fg
Pll = Pll * 4
Pll = Pll / Fref
Fset = Int(pll)
1st = High(fset)
Reset 1st.7                                                 'not mute
Reset 1st.6                                                 'not search
2nd = Low(fset)
3rd = &B00010000
4st = &B00010010
5th = &B00000000
I2cstart
I2cwbyte &HC0
I2cwbyte 1st
I2cwbyte 2nd
I2cwbyte 3rd
I2cwbyte 4st
I2cwbyte 5th
I2cstop


Loop
End




d. VIDEO HASILNYA













Cara Mengakses Trafo Arus (Current Transformer) Untuk Pengukuran Arus

Cara Mengakses Trafo Arus (Current Transformer) Untuk Pengukuran Arus


             Kali ini akan saya jelaskan mengenai bagaimana cara mengakses trafo arus (current transformer) supaya bisa digunakan untuk pengukuran arus AC. Sensor ini sangat bagus sekali jika digunakan untuk mendeteksi arus atau membaca arus, kelebihan dari trafo arus ini yaitu bisa dilewati oleh arus lebih dari 200 A, tergantung tipe dan jenis trafo arus yang dipakai, pada contoh digunakan trafo arus 300/5 yang artinya jika ada arus yang lewat sebesar 300A maka akan terbaca di outputnya adalah 5A, sama seperti halnya trafo step down, tapi jika ingin diakses oleh mikrokontroller harus dikonversi terlebih dahulu ke tegangan karena ADC mikrokontroller tidak bisa membaca arus. untuk lebih jelasnya berikut skema dan programnya. Untuk cara kalibrasi sensor, cek disini LINK



a. Minium System ATMega16




b. Current Transformer (Trafo Arus)





c. Rangkaian Pengubah Arus ke Tegangan


*Note = IC yang dipakai bisa TL082, LM358, LM741, OP7.




d. Rangkaian Penyearah




e. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 12000000
$baud = 9600

Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Dim Dataadc As Word
Dim Volt As Single
Dim Teg As String * 5

Cls
Cursor Off

Start Adc

Do

Dataadc = Getadc(7)
Volt = Dataadc * 5
Volt = Volt / 1023

Teg = Fusing(volt , "#.##")

Upperline
Lcd "ADC = " ; Dataadc

Lowerline
Lcd "Volt = " ; Teg

Waitms 200

Loop




f. VIDEO HASILNYA











Membuat Kontroller Angle Servo dengan Magnetometer GY-273 (HMC5883L)

Membuat Kontroller Angle Servo dengan Magnetometer GY-273 (HMC5883L)


          Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa digunakan untuk mengendalikan sudut servo, aplikasi dari alat ini sangat banyak sekali diantara yaitu untuk mengendalikan hover pesawat, sebagai joystick robot, kendali arah belokan dan sebagainya, Alat ini menggunakan sensor compass HMC5883L atau nama lainnya GY-273, sensor ini memberikan output 0 derajat sampai 360 derajat, sehingga cocok dengan gerakan servo yang ada di range 10 - 220, maka dari itu kedua device ini sangat bagus sekali jika dikombinasikan, untuk lebih jelasnya berikut skema dan programnya.



a. Minimum System




b. Sensor GY-273





c. Motor Servo 






d. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 64
'-------------------------------------------------------------------------------
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
Config Portb.0 = Output

'=====[ Global Vars & Constants ]========
Dim Hmc_x As Integer
Dim Hmc_xl As Byte At Hmc_x + 0 Overlay
Dim Hmc_xh As Byte At Hmc_x + 1 Overlay

Dim Hmc_y As Integer
Dim Hmc_yl As Byte At Hmc_y + 0 Overlay
Dim Hmc_yh As Byte At Hmc_y + 1 Overlay

Dim Hmc_z As Integer
Dim Hmc_zl As Byte At Hmc_z + 0 Overlay
Dim Hmc_zh As Byte At Hmc_z + 1 Overlay
Dim Hmc_status As Byte

Dim X As Single
Dim Y As Single
Dim Z As Single
Dim Angle As Single
Dim Angleup As Single
Dim Angledown As Single
Dim A As Integer

Const Hmc_w = &H3C
Const Hmc_r = &H3D

'-------------------------------------------------------------------------------
'=====[ Misc. config ]==============
Config Scl = Portc.0
Config Sda = Portc.1
Config Twi = 400000
I2cinit

Ddrc.7 = 0
Set Portc.7

Gosub Hmc_initialize
'-------------------------------------------------------------------------------
Enable Interrupts

Main:

Do
   Gosub Hmc_readdata
   Gosub Hmc_readstatus

   ' convert integer to float
   X = Hmc_x
   Y = Hmc_y
   Z = Hmc_z

   Angle = Atn2(y , X)
   Angle = Angle * 57.29577951
   Angle = Angle + 180

   If Angle > 200 Then
   Angle = 200
   Elseif Angle < 40 Then
   Angle = 40
   Else
   A = Angle
   Servo(1) = Angle
   End If

   If Pinc.7 = 0 Then
   Servo(1) = 100
   Angleup = Angle + 10
   Angledown = Angle - 10

   Goto Awal
   End If

   Waitms 100

'Servo(1) = 40
'Wait 1

'Servo(1) = 200
'Wait 1

Loop

Awal:
Do
   Gosub Hmc_readdata
   Gosub Hmc_readstatus

   ' convert integer to float
   X = Hmc_x
   Y = Hmc_y
   Z = Hmc_z

   Angle = Atn2(y , X)
   Angle = Angle * 57.29577951
   Angle = Angle + 180

If Angle > Angleup Or Angle < Angledown Then
Goto Main
End If

Loop

'=====[ Initialize HMC Compass ]========
Hmc_initialize:
   I2cstart
    I2cwbyte Hmc_w
    I2cwbyte &H00
    I2cwbyte &B0101_1000
    I2cwbyte &H0010_0000
    I2cwbyte &H0000_0000
   I2cstop
Return
'-------------------------------------------------------------------------------

'=====[ Read HMC Compass ]===========
Hmc_readstatus:
' Read HMC Compass status
   I2cstart
    I2cwbyte Hmc_w
    I2cwbyte &H09
   I2cstart
    I2cwbyte Hmc_r
    I2crbyte Hmc_status , Nack
   I2cstop
Return
'-------------------------------------------------------------------------------

'=====[ Read HMC Compass ]=========
Hmc_readdata:
   I2cstart
    I2cwbyte Hmc_w
    I2cwbyte &H03
   I2cstart
    I2cwbyte Hmc_r
    I2crbyte Hmc_xh , Ack
    I2crbyte Hmc_xl , Ack
    I2crbyte Hmc_zh , Ack
    I2crbyte Hmc_zl , Ack
    I2crbyte Hmc_yh , Ack
    I2crbyte Hmc_yl , Nack
   I2cstop
Return
'------




e. VIDEO HASILNYA