| 1 | = MAX6675 K型熱電対温度センサのスケッチ = |
| 2 | |
| 3 | * [wiki:MAX6675 キットについてはこちら] |
| 4 | * [wiki:MAX6675Instruction 作り方の説明] |
| 5 | * [http://www.switch-science.com/products/detail.php?product_id=146 キットとして販売しています。] |
| 6 | |
| 7 | どんなスケッチ(ソフトウェア)で使うのかを説明します。 |
| 8 | |
| 9 | すでにモジュールが完成して、Arduino Duemilanoveのデジタル8番~13番の位置に差し込んであるものとします。 |
| 10 | |
| 11 | == 手っ取り早い方法 == |
| 12 | |
| 13 | このページの添付ファイル「MAX6675.zip」をダウンロードして、展開します。 |
| 14 | 展開してできたフォルダを、Arduinoのスケッチブックのフォルダに移動します。 |
| 15 | スケッチブックのフォルダは、ウィンドウズでは標準は「マイドキュメント」(XPの場合)または「ドキュメント」(Vistaの場合)の中にある、「Arduino」というフォルダです。 |
| 16 | |
| 17 | Arduino統合環境を起動して、「ファイル」メニューの「スケッチブック」から「MAX6675」を探して開いてください。 |
| 18 | |
| 19 | あとは、普通にArduinoに書き込んで実行します。 |
| 20 | 「シリアルモニタ」を有効にすると、定期的に温度が表示されます。 |
| 21 | 「-1000.00」と表示された場合は、熱電対がきちんとつながっていません。 |
| 22 | また、モジュールが壊れている場合も同様の表示になります。 |
| 23 | |
| 24 | スケッチの先頭に、以下の定義があります。 |
| 25 | {{{ |
| 26 | #!c |
| 27 | #define VCC 8 |
| 28 | #define GND 9 |
| 29 | #define SLAVE 10 |
| 30 | }}} |
| 31 | モジュールをデジタルの8番~13番に直結しない場合は、これらの定義を変更してください。 |
| 32 | |
| 33 | VCCおよびGNDの定義は、デジタルの8番および9番からモジュールに電源供給を行うためです。 |
| 34 | こんなずるをしないで、ちゃんと電源に接続する場合は、この2行を削除してください。 |
| 35 | |
| 36 | SLAVEの定義は、SPIで言うところのスレーブセレクトにデジタルの何番を使うかを決めています。 |
| 37 | |
| 38 | == 手っ取り早くない方法 == |
| 39 | |
| 40 | 慣れている方なら、こっちの方が手っ取り早いかもしれません。 |
| 41 | |
| 42 | * 適当な名前でスケッチを新規作成します。 |
| 43 | * 下記の「MAX6675.pde」のソースをコピーして、先ほど作成したスケッチのウィンドウに貼り付けます。 |
| 44 | * ウィンドウの上部右端の「→」のアイコンをクリックするとメニューが現れます。 |
| 45 | * このメニューから「新規タブ」をクリック。 |
| 46 | * 画面下部でファイル名を聞かれます。「SPI.cpp」と入力します。 |
| 47 | * 現れたタブに、下記の「SPI.cpp」の内容をコピーペーストします。 |
| 48 | * 同様に「SPI.h」のタブを作り、「SPI.h」の内容を貼り付けます。 |
| 49 | |
| 50 | === MAX6675.pde === |
| 51 | {{{ |
| 52 | #!c |
| 53 | #include "SPI.h" |
| 54 | |
| 55 | #define VCC 8 |
| 56 | #define GND 9 |
| 57 | #define SLAVE 10 |
| 58 | |
| 59 | void |
| 60 | setup() |
| 61 | { |
| 62 | #ifdef GND |
| 63 | pinMode(GND, OUTPUT); |
| 64 | digitalWrite(GND, LOW); |
| 65 | #endif |
| 66 | #ifdef VCC |
| 67 | pinMode(VCC, OUTPUT); |
| 68 | digitalWrite(VCC, HIGH); |
| 69 | #endif |
| 70 | |
| 71 | Serial.begin(9600); |
| 72 | SPI_Master.begin(SLAVE); |
| 73 | } |
| 74 | |
| 75 | void |
| 76 | loop() |
| 77 | { |
| 78 | int value; |
| 79 | |
| 80 | delay(500); |
| 81 | SPI_Master.enable(SLAVE); |
| 82 | value = SPI_Master.read() << 8; |
| 83 | value |= SPI_Master.read(); |
| 84 | SPI_Master.disable(); |
| 85 | |
| 86 | if ((value & 0x0004) != 0) |
| 87 | Serial.println("Error"); |
| 88 | else |
| 89 | Serial.println((value >> 3) * 0.25); |
| 90 | } |
| 91 | }}} |
| 92 | |
| 93 | === SPI.cpp === |
| 94 | {{{ |
| 95 | #!c |
| 96 | #include "SPI.h" |
| 97 | |
| 98 | boolean SPI_Master_Class::initialized_ = false; |
| 99 | int SPI_Master_Class::enabled_ = -1; |
| 100 | |
| 101 | void |
| 102 | SPI_Master_Class::begin(int slaveselecter) { |
| 103 | if (!initialized_) { |
| 104 | initialized_ = true; |
| 105 | enabled_ = -1; |
| 106 | pinMode(SS, OUTPUT); // Must be set as OUTPUT before SPE is asserted. |
| 107 | pinMode(MOSI, OUTPUT); |
| 108 | pinMode(MISO, INPUT); |
| 109 | digitalWrite(MISO, HIGH); // Pull-up |
| 110 | pinMode(SCK, OUTPUT); |
| 111 | SPCR = (1<<SPE)|(1<<MSTR); // SPE: SPI Enable; MSTR: Master |
| 112 | byte garbage; |
| 113 | garbage = SPSR; |
| 114 | garbage = SPDR; |
| 115 | } |
| 116 | |
| 117 | if (slaveselecter != SS) |
| 118 | pinMode(slaveselecter, OUTPUT); |
| 119 | digitalWrite(slaveselecter, HIGH); // Disable |
| 120 | } |
| 121 | |
| 122 | void |
| 123 | SPI_Master_Class::enable(int slaveselecter) { |
| 124 | disable(); |
| 125 | digitalWrite(slaveselecter, LOW); |
| 126 | enabled_ = slaveselecter; |
| 127 | } |
| 128 | |
| 129 | void |
| 130 | SPI_Master_Class::disable() { |
| 131 | if (enabled_ >= 0) { |
| 132 | digitalWrite(enabled_, HIGH); |
| 133 | enabled_ = -1; |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | byte |
| 138 | SPI_Master_Class::write_and_read(byte data) const { |
| 139 | SPDR = data; |
| 140 | while (!(SPSR & (1<<SPIF))) |
| 141 | ; |
| 142 | return SPDR; |
| 143 | } |
| 144 | |
| 145 | void |
| 146 | SPI_Master_Class::write(byte data) const { |
| 147 | write_and_read(data); |
| 148 | } |
| 149 | |
| 150 | byte |
| 151 | SPI_Master_Class::read() const { |
| 152 | return write_and_read(0x00); |
| 153 | } |
| 154 | |
| 155 | SPI_Master_Class SPI_Master; |
| 156 | }}} |
| 157 | |
| 158 | === SPI.h === |
| 159 | {{{ |
| 160 | #!c |
| 161 | #ifndef __SPI_H__ |
| 162 | #define __SPI_H__ |
| 163 | |
| 164 | #include "WProgram.h" |
| 165 | |
| 166 | class SPI_Master_Class { |
| 167 | public: |
| 168 | static void begin(int slaveselecter); |
| 169 | void enable(int slaveselecter); |
| 170 | void disable(); |
| 171 | byte write_and_read(byte data) const; |
| 172 | void write(byte data) const; |
| 173 | byte read() const; |
| 174 | |
| 175 | private: |
| 176 | static boolean initialized_; |
| 177 | static const int SS = 10; |
| 178 | static const int MOSI = 11; |
| 179 | static const int MISO = 12; |
| 180 | static const int SCK = 13; |
| 181 | static int enabled_; |
| 182 | }; |
| 183 | |
| 184 | extern SPI_Master_Class SPI_Master; |
| 185 | |
| 186 | #endif //__SPI_H__ |
| 187 | }}} |