12F675 16F819
プログラムメモリ 1K word 2K word
データメモリ 64Byte 256Byte
TOピン 16
AD-CON 4ch 5ch
INT-OSC 4MHz 8MHz
サーボモーターのドライブ(2)

 サーボモーターのドライブのページでは、PIC12F675を使用しましたが、制御数に限界を感じましたので、PIC16F819を使用して制御数を増やしてみました。PIC12F675はアナログポートは3つあるのですが、1ボリュームに対して1サーボという使い方に対しては、A3が出力として使用できないので2ポートまでしか使用できません。一方、PIC16F819では5ポートまで使用できそうです。ここでは3ポートで製作しました。

12F675と16F819は、外形が全く違いますが、主要な相違点は上表のとおりです。

 当サイトの、12F675を使用した「サーボモーターのドライブ」のプログラムのメモリー使用量は、ROMが343wordで33%、RAMが21Byteで33%とどちらも1/3の使用量ですので、これだけをみると、16F819に替える必要性はありません。当ページのプログラムのメモリー使用量もほとんど同じです。1チャンネル増やしただけで、そのまま移植していますので当然と言えば当然です。使用できる入出力のポートの数を各々1つ増やしたかっただけです。内部発振の最大クロック周波数は2倍違いますが、実際は同じ4MHzで使っています。
 電源の容量が不足すると動作が不安定になります。今回、当初5V2Aを使用したのですがトルク不足に悩まされました。3Aは欲しいところです。

 //12F675でのプログラムから16F819に移植
#include <16F819.h>
#byte PIR1=0x0c
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR
#DEVICE ADC=8
#use delay(clock=4000000)

Long haba0;
Long haba1;
Long haba2;
int V0;
int V1;
int V2;

#int_timer0
void Interval(void)
 {
  output_Low(PIN_B0);
  output_Low(PIN_B1);
  output_Low(PIN_B3);
  set_timer0(176);

  haba0=(1800/255)*V0+600;
  PIR1=0;
  set_timer1(65536-haba0);
  output_high(PIN_B0);
  while((PIR1 & 0x01)==0){ };
  output_Low(PIN_B0);
  PIR1=0;

  haba1=(1800/255)*V1+600;
  PIR1=0;
  set_timer1(65536-haba1);
  output_high(PIN_B1);
  while((PIR1 & 0x01)==0){ };
  output_Low(PIN_B1);
  PIR1=0;

  haba2=(1800/255)*V2+600;
  PIR1=0;
  set_timer1(65536-haba2);
  output_high(PIN_B3);
  while((PIR1 & 0x01)==0){ };
  output_Low(PIN_B3);
  PIR1=0;
  }

void main()
{
  set_tris_a(0xFF);
  set_tris_b(0x00);

  setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256);
  set_timer0(178);
  enable_interrupts(INT_TIMER0);

  setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);

  setup_adc_ports(AN0_AN1_AN2_AN4_VSS_VREF);
  setup_adc(ADC_CLOCK_DIV_8);
  enable_interrupts(GLOBAL);

  while(1)
   {
    set_adc_channel(0);
    delay_us(50);
    V0=read_adc();

    set_adc_channel(1);
    delay_us(50);
    V1=read_adc();

    set_adc_channel(2);
    delay_us(50);
    V2=read_adc();
   }
}

トップページへ戻る

ソースリスト

5mm厚のアクリル上に基板、スライドスイ
ッチ大型サーボを乗せ、このサーボにプ
ラスチックのアームをつけ、このアーム
の先端にSG90を2個取り付けています。







基板は必要最小限の部品しか載っていま
せん。







スライドスイッチを3個並べています。
回転摺動より操作が楽にできます。







根元には大き目のサーボを使用していま
す。銘板がないのでメーカーや仕様は分
かりませんが、トルクはSG90に比べ間違
いなくありそうなのでPICでの直接駆動は
やめ2SC945を介しています。






アームの先端にはSG90を2個つけています。



回路図
12F675と16F819の相違

 内部発振を用いていますので、外付け構成部品が少なく済んでいます。AD変換の基準電圧は、RA3とVss間の電圧を基準とします。出力はRB0・RB1・RB3で、RB3には高負荷のサーボをつなげるようにしています。ソフトの構成は、ほぼ同じで675と819の相違をヘッダーファイルで確認しながら作成していきます。