Anda di sini

14 posts / 0 new
Posting terakhir
#1

unstable motor servo di raspberry pi (raspbian)


mas sorry nih numpang tanya

saya kan ada project untuk buat smarthome,jadi fungsinya untuk controrl
listrik secara jarak jauh dan streaming cctv dengan penggeraknya 2 motor
servo sebagai kiri-kanan dan atas bawah

nah kendala yg saya alami adalah di bagian motor servonya,

jadi kalau dalam keadaan standby atau raspi baru on,si motor servonya itu
tidak bisa diam jadi gerak2 gitu mas,

nah untuk software nya saya menggunakan python bawaan raspinya,degan tampilan
html sebagai tampilan controlnya.

kalau boleh tanya itu kendalanya ada di bagian mana yah ?

kalau untuk settingan python.app sama htmlnya bisa saya kirimkan mas kalau
mas mau liat

sebelumnya terima kasih,semoga mas dapat membantu problem saya

untuk tampilan pythonnya (app.py)


import RPi.GPIO as GPIO
import time
from flask import Flask, render_template

app = Flask(__name__)

# Pin Motor Servo
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
GPIO.setup(32, GPIO.OUT)
# Pin Relay

GPIO.setup(31, GPIO.OUT)
GPIO.setup(33, GPIO.OUT)
GPIO.setup(35, GPIO.OUT)
GPIO.setup(37, GPIO.OUT)
v = GPIO.PWM(12, 50)
h = GPIO.PWM(32, 50)
vcurrent = 6.25
hcurrent = 7.5
v.start(vcurrent)
h.start(hcurrent)

.route('/')
def index():
    return render_template('index.html')

.route('/cam-up')
def cam_up():
    global vcurrent
    # p.start(current)
    vcurrent = vcurrent - 0.25
    v.ChangeDutyCycle(vcurrent)
    # p.stop()
    return str(vcurrent)

.route('/cam-down')
def cam_down():
    global vcurrent
    # p.start(current)
    vcurrent = vcurrent + 0.25
    v.ChangeDutyCycle(vcurrent)
    # p.stop()
    return str(vcurrent)

.route('/cam-right')
def cam_right():
    global hcurrent
    # p.start(current)
    hcurrent = hcurrent - 0.25
    h.ChangeDutyCycle(hcurrent)
    # p.stop()
    return str(hcurrent)

.route('/cam-left')
def cam_left():
    global hcurrent
    # p.start(current)
    hcurrent = hcurrent + 0.25
    h.ChangeDutyCycle(hcurrent)
    # p.stop()
    return str(hcurrent)

.route('/lamp1-on')
def lamp1_on():
    GPIO.output(31, 0)
    return 'ok'

.route('/lamp1-off')
def lamp1_off():
    GPIO.output(31, 1)
    return 'ok'

.route('/lamp2-on')
def lamp2_on():
    GPIO.output(33, 0)
    return 'ok'

.route('/lamp2-off')
def lamp2_off():
    GPIO.output(33, 1)
    return 'ok'

.route('/lamp3-on')
def lamp3_on():
    GPIO.output(35, 0)
    return 'ok'

.route('/lamp3-off')
def lamp3_off():
    GPIO.output(35, 1)
    return 'ok'

.route('/lamp4-on')
def lamp4_on():
    GPIO.output(37, 0)
    return 'ok'

.route('/lamp4-off')
def lamp4_off():
    GPIO.output(37, 1)
    return 'ok'

if __name__ == '__main__':
    app.run(debug=False, host='0.0.0.0')

untuk tampilan web interfacenya


<html> <body> <h1> <pre> Smart Home </pre></h1> <img src="http://192.168.2.3:8081/" />
<br />


<button id="cam-left">Turn Left</button> &nbsp;
<button id="cam-right">Turn Right</button> &nbsp;
<button id="cam-up">Elevate Up</button> &nbsp;
<button id="cam-down">Elevate down</button> &nbsp;
<br />
<br />

Lamp 1 :
<button id="lamp1-on">On </button> &nbsp;
<button id="lamp1-off">Off </button> &nbsp;
<br />

Lamp 2 :
<button id="lamp2-on">On </button> &nbsp;
<button id="lamp2-off">Off </button> &nbsp;
<br />

Lamp 3 :
<button id="lamp3-on">On </button> &nbsp;
<button id="lamp3-off">Off </button> &nbsp;
<br />

Lamp 4 :
<button id="lamp4-on">On </button> &nbsp;
<button id="lamp4-off">Off </button> &nbsp;
<br />

<script type="text/javascript" src="/static/js/jquery-2.2.4.min.js"></script>
<script type="text/javascript">
$(function() {
$('-right').click(function() {
$.ajax({
url: '/cam-right',
type: 'GET'
}).success(function(data) {
console.log(data);
if (data === '2.5') {
$('-right').attr('disabled', true);
}
if (data !== '11.25') {
$('-left').attr('disabled', false);
}

});
});

$('-left').click(function() {
$.ajax({
url: '/cam-left',
type: 'GET'
}).success(function(data) {
console.log(data);
if (data === '11.25') {
$('-left').attr('disabled', true);
}
if (data !== '2.5') {
$('-right').attr('disabled', false);
}

});
});

$('-up').click(function() {
$.ajax({
url: '/cam-up',
type: 'GET'
}).success(function(data) {
console.log(data);
if (data === '6.25') {
$('-up').attr('disabled', true);
}
if (data !== '6.0') {
$('-down').attr('disabled', false);
}
});
});

$('-down').click(function() {
$.ajax({
url: '/cam-down',
type: 'GET'
}).success(function(data) {
console.log(data);
if (data === '12.0') {
$('-down').attr('disabled', true);
}
if (data !== '2.5') {
$('-up').attr('disabled', false);
}
});
});

$('-on').click(function() {
$.ajax({
url: '/lamp1-on',
type: 'GET'
}).success(function(data) {
if (data === 'ok') {
$('-on').attr('disabled', true);
$('-off').attr('disabled', false);
}
});
});

$('-off').click(function() {
$.ajax({
url: '/lamp1-off',
type: 'GET'
}).success(function(data) {
if (data === 'ok') {
$('-off').attr('disabled', true);
$('-on').attr('disabled', false);
}
});
});

$('-on').click(function() {
$.ajax({
url: '/lamp2-on',
type: 'GET'
}).success(function(data) {
if (data === 'ok') {
$('-on').attr('disabled', true);
$('-off').attr('disabled', false);
}
});
});

$('-off').click(function() {
$.ajax({
url: '/lamp2-off',
type: 'GET'
}).success(function(data) {
if (data === 'ok') {
$('-off').attr('disabled', true);
$('-on').attr('disabled', false);
}
});
});

$('-on').click(function() {
$.ajax({
url: '/lamp3-on',
type: 'GET'
}).success(function(data) {
if (data === 'ok') {
$('-on').attr('disabled', true);
$('-off').attr('disabled', false);
}
});
});

$('-off').click(function() {
$.ajax({
url: '/lamp3-off',
type: 'GET'
}).success(function(data) {
if (data === 'ok') {
$('-off').attr('disabled', true);
$('-on').attr('disabled', false);
}
});
});

$('-on').click(function() {
$.ajax({
url: '/lamp4-on',
type: 'GET'
}).success(function(data) {
if (data === 'ok') {
$('-on').attr('disabled', true);
$('-off').attr('disabled', false);
}
});
});

$('-off').click(function() {
$.ajax({
url: '/lamp4-off',
type: 'GET'
}).success(function(data) {
if (data === 'ok') {
$('-off').attr('disabled', true);
$('-on').attr('disabled', false);
}
});
});
});
</script>
</body>
</html>

Halo Mas Ginanjar,


Halo Mas Ginanjar,

Kalau motor servo tidak stabil, kemungkinan besar penyebabnya adalah di power mas. Mungkin powernya tidak bersih atau ada banyak noise, mungkin juga groundnya tidak dalam posisi benar, biasanya tidak di common ground dengan ground Raspi.

Tapi jika motor servonya hanya unstable ketika start up dan standby, tapi berjalan normal ketika dikontrol, bisa juga ada masalah dalam inisialisasi pwm di GPIO Raspinya.

Untuk bisa memberi solusi saya perlu informasi tambahan mengenai skematik rangkaiannya, trutama pengkabelan dan sumber power dari motor servonya diambil dari mana dan jenis servonya..


HTSL://HIGH THINKING SIMPLE LIVING . ME

(Reply to #4)

motor servo unstablle


power servo saya ambil dari pin gpio raspberry pi nya beserta groundnya juga, pernah coba power 5v nya dari power eksternal(dari charger hp)kondisinya tetap masih tdk stabil mas jadi kalau dalam kondisi lagi di kontrol misal atas bawah itu stabil,tapi ketika didiamkan servonya kembali unstable mas masalah di inisialisasi pwm gpio itu gimana maksudnya mas ? saya coba gonta-ganti pin control di gpio nya tetap sama saja mas,tdk stabil untuk skematiknya langsung dari pin gpio raspinya di jumper langsung ke motor servonya mas, untuk jenis servonya saya pakai type MG90S mas kalau untuk coding nya sendiri ada kesalahan atau kekurangan ngga mas yah ? thanks
(Reply to #5)

Grounding Bermasalah


Sepertinya itu mengarah ke masalah power dan grounding mas,

coba itu power servonya dipisah, ambil dari sumber lain misal adaptor 5V jangan dari Raspinya dan pastikan di-common ground dengan ground Raspi. Jadi lengkapnya pengkabelannya jadi begini:

Pin Data Servo ----> Pin GPIO Raspi
Pin Vcc Servo ----> +5V dari External Power Adapter
Pin GND Servo -----> GND dari External Power Adapter dan di common ground dengan GND pada Raspi.

Karena saya dulu pernah mengalami masalah serupa, dan solusinya saya bisa pastikan seperti diatas dapat menyelesaikan masalahnya.


HTSL://HIGH THINKING SIMPLE LIVING . ME

(Reply to #6)

jadi untuk groundnya di


jadi untuk groundnya di paralel dengan ground dari pin gpionya mas ? tapi kalau saya ukur tegangan yang tidak stabilnya itu justru dari pin data nya mas ,bukan dari power servonya kalau untuk script codingnya apa sudah benar mas ? kalau boleh saya bisa minta coding yang dulu mas buat ngga ? terima kasih

Koding PWM Servo Raspi


Untuk scriptnya sudah benar, saya juga pakai fungsi software PWM bawaan RPi.GPIO. Kalau menurut pengalaman saya yang bermasalah itu powernya tidak bersih dan tidak di common ground apabila mengambil dari sumber yang berbeda.

Kalau pin PWM ketika sedang bekerja tegangannya memang berubah2 mas. Saya kurang jelas kalau yang mas maksud itu ketika PWM tidak bekerja tapi tegangannya tidak stabil, atau ketika PWM sedang bekerja. Kalau ketika bekerja, itu berarti pertanda bagus karena PWMnya berjalan dengan semestinya.

Dan perlu dicatat juga kalau kernel Linux itu tidak realtime ketika melakukan render fungsi PWM, karena adanya fungsi priority task. Jika ada program lain yang berjalan disaat yang sama, bisa saja si kernel memprosesnya terlebih dahulu dan mendelay fungsi PWM. Sebenarnya ada banyak faktor yang menyebabkan itu terjadi. Mungkin juga versi Raspinya dan versi RPi.GPIO yang belum diupdate ke versi terbaru.

Saran saya coba diupdate dulu, dan coba powernya dipisah seperti yang saya jelaskan sebelumnya. Semoga membantu.


jadi untuk groundnya di paralel dengan ground dari pin gpionya mas ?

Iya, di-paralel dengan GND Rapsi. Dan contoh yang kemarin sempat saya coba di link ini. http://razzpisampler.oreilly.com/ch05.html


HTSL://HIGH THINKING SIMPLE LIVING . ME

(Reply to #8)

problem servo


mas saya sudah coba dengan power eksternal untuk motor servonya,dan dengan ground yang disatukan dengan gnd raspi hasilnya masih tetap sama mas,si motor servo masih gerak2 sendiri/tidak stabil kira2 ada solusi lain ga mas yah ?

power supply tidak bersih


Sepertinya power supplynya tidak bersih mas. Solusinya coba tambahkan snubber/filter menggunakan kapasitor.

Jadi antara pin vcc dan pin gnd servonya tambahkan satu kapasitor 1uF 16V. Ingat polaritasnya kaki kapasitor yg panjang hubungkan ke VCC dan yg lg satu ke GND. Ini akan membantu menjernihkan powernya.

Dan perlu saya pastikan lg, servonya mulai getar2 sebelum ato sesudah script pythonnya dijalankan? Dan apabila ketika servonya masih getat getar trus pin data yg kuning mas cabut apakah servonya masih getar2?


HTSL://HIGH THINKING SIMPLE LIVING . ME

(Reply to #10)

problem servo


saya sudah coba untuk cara itu mas dengan menambahkan kapasitor,tapi masih tetap problem mas(servo bergerak) untuk script pythonnya kan saya buat autorun ketika raspi pertama menyala mas,nah pada saat itu jga si servo mulai getar-getar ketika pin data di cabut(kuning) kondisi servo diam mas,ngga gerak-gerak lagi dan ketka di ukur emang tegangan yang keluar dari pin kuning itu naek turun,tidak diam di satu nilai vdc..
(Reply to #11)

Software/Library Problem


Oke, jadi sekarang harus di cek lagi disisi softwarenya.

Yang perlu diketahui, Pin PWM memang akan naik turun nilai VDCnya kalau sedang bekerja, karena dengan cara demikian dia dapat mengontrol arah gerak servonya. Tapi yang jadi masalah adalah, ketika timing/waktu dari software PWM itu tidak bersih atau tidak konsisten sehingga menyebabkan VDC yang seharusnya menggerakan servo dengan presisi malah jadi amburadul.

Pertama kita mesti tahu dulu kalau chanel PWM yang ada di pin yang mas pakai untuk mengontrol servo itu benar-benar bersih dari segala noise. Coba itu autorunnya di stop dulu, terus mas coba restart raspinya.. Cek apakah servonya masih gerak-gerak meskipun script yg mas buat tidak dijalankan.

Kalau servonya tidak bergerak berarti pin PWMnya aman, dan yang masalah adalah disisi software/program. Perlu dilakukan adjustmen untuk menyesuaikan dengan jenis servo yang mas pakai. Terutama parameter Duty Cycle dan Frequencynnya.


HTSL://HIGH THINKING SIMPLE LIVING . ME

dari data saya


utk autorunnya saya sudah coba matikan,dan si servo pun berhenti, tapi ketika perintah sudo python /home/smarthome/app.py kembali di panggil,si servo pun kembali gerak2 sendiri mas ... maksudnya di adjusment gimana mas yah ? kalau dari script yang dari saya kira2 yang harus di rubah dimananya yah mas ? untuk frequency dan duty cycle yang benar itu nilainya berapa yah mas ? thanks

RPi.GPIO Freq. & DutyCycle


Untuk frequency dan duty cycle itu bisa beda-beda berdasarkan jenis & tipe servo mas.

Frequency bisa dicoba di ganti-ganti dengan cara merubah baris:

v = GPIO.PWM(12, 50)
h = GPIO.PWM(32, 50)

Menjadi

v = GPIO.PWM(12, 100)
h = GPIO.PWM(32, 100)

Rumus untuk mendapatkan DutyCycle bisa menggunakan:

angle = 90
duty = float(angle) / 10.0 + 2.5
x.ChangeDutyCycle(duty)

Jika sudah dicoba dan tetap tidap mau, sepertinya servo yang mas pakai tidak toleran dengan jitter yang diakibatkan oleh fungsi software PWM dari RPi.GPIO. Perlu diketahui kalau Raspi tidak punya hardware PWM seperti yang dimiliki oleh Arduino, Raspi hanya mengandalkan PWM buatan menggunakan teknik manipulasi software melalui DMA (Direct Memory Access) jadi akibatnya akan ada sedikit jitter/riak-riak pada nilai PWM yang dihasilkan sehingga mengakibatkan servo getar-getar sendiri.


HTSL://HIGH THINKING SIMPLE LIVING . ME