43 | | == 手っ取り早くない方法 == |
44 | | |
45 | | 慣れている方なら、こっちの方が手っ取り早いかもしれません。 |
46 | | |
47 | | * 適当な名前でスケッチを新規作成します。 |
48 | | * 下記の「MAX6675.pde」のソースをコピーして、先ほど作成したスケッチのウィンドウに貼り付けます。 |
49 | | * ウィンドウの上部右端の「→」のアイコンをクリックするとメニューが現れます。 |
50 | | * このメニューから「新規タブ」をクリック。 |
51 | | * 画面下部でファイル名を聞かれます。「SPI.cpp」と入力します。 |
52 | | * 現れたタブに、下記の「SPI.cpp」の内容をコピーペーストします。 |
53 | | * 同様に「SPI.h」のタブを作り、「SPI.h」の内容を貼り付けます。 |
54 | | |
55 | | === MAX6675.pde === |
56 | | {{{ |
57 | | #!c |
58 | | #include "SPI.h" |
59 | | |
60 | | #define VCC 8 |
61 | | #define GND 9 |
62 | | #define SLAVE 10 |
63 | | |
64 | | void |
65 | | setup() |
66 | | { |
67 | | #ifdef GND |
68 | | pinMode(GND, OUTPUT); |
69 | | digitalWrite(GND, LOW); |
70 | | #endif |
71 | | #ifdef VCC |
72 | | pinMode(VCC, OUTPUT); |
73 | | digitalWrite(VCC, HIGH); |
74 | | #endif |
75 | | |
76 | | Serial.begin(9600); |
77 | | SPI_Master.begin(SLAVE); |
78 | | } |
79 | | |
80 | | void |
81 | | loop() |
82 | | { |
83 | | int value; |
84 | | |
85 | | delay(500); |
86 | | SPI_Master.enable(SLAVE); |
87 | | value = SPI_Master.read() << 8; |
88 | | value |= SPI_Master.read(); |
89 | | SPI_Master.disable(); |
90 | | |
91 | | if ((value & 0x0004) != 0) |
92 | | Serial.println("Error"); |
93 | | else |
94 | | Serial.println((value >> 3) * 0.25); |
95 | | } |
96 | | }}} |
97 | | |
98 | | === SPI.cpp === |
99 | | {{{ |
100 | | #!c |
101 | | #include "SPI.h" |
102 | | |
103 | | boolean SPI_Master_Class::initialized_ = false; |
104 | | int SPI_Master_Class::enabled_ = -1; |
105 | | |
106 | | void |
107 | | SPI_Master_Class::begin(int slaveselecter) { |
108 | | if (!initialized_) { |
109 | | initialized_ = true; |
110 | | enabled_ = -1; |
111 | | pinMode(SS, OUTPUT); // Must be set as OUTPUT before SPE is asserted. |
112 | | pinMode(MOSI, OUTPUT); |
113 | | pinMode(MISO, INPUT); |
114 | | digitalWrite(MISO, HIGH); // Pull-up |
115 | | pinMode(SCK, OUTPUT); |
116 | | SPCR = (1<<SPE)|(1<<MSTR); // SPE: SPI Enable; MSTR: Master |
117 | | byte garbage; |
118 | | garbage = SPSR; |
119 | | garbage = SPDR; |
120 | | } |
121 | | |
122 | | if (slaveselecter != SS) |
123 | | pinMode(slaveselecter, OUTPUT); |
124 | | digitalWrite(slaveselecter, HIGH); // Disable |
125 | | } |
126 | | |
127 | | void |
128 | | SPI_Master_Class::enable(int slaveselecter) { |
129 | | disable(); |
130 | | digitalWrite(slaveselecter, LOW); |
131 | | enabled_ = slaveselecter; |
132 | | } |
133 | | |
134 | | void |
135 | | SPI_Master_Class::disable() { |
136 | | if (enabled_ >= 0) { |
137 | | digitalWrite(enabled_, HIGH); |
138 | | enabled_ = -1; |
139 | | } |
140 | | } |
141 | | |
142 | | byte |
143 | | SPI_Master_Class::write_and_read(byte data) const { |
144 | | SPDR = data; |
145 | | while (!(SPSR & (1<<SPIF))) |
146 | | ; |
147 | | return SPDR; |
148 | | } |
149 | | |
150 | | void |
151 | | SPI_Master_Class::write(byte data) const { |
152 | | write_and_read(data); |
153 | | } |
154 | | |
155 | | byte |
156 | | SPI_Master_Class::read() const { |
157 | | return write_and_read(0x00); |
158 | | } |
159 | | |
160 | | SPI_Master_Class SPI_Master; |
161 | | }}} |
162 | | |
163 | | === SPI.h === |
164 | | {{{ |
165 | | #!c |
166 | | #ifndef __SPI_H__ |
167 | | #define __SPI_H__ |
168 | | |
169 | | #include "WProgram.h" |
170 | | |
171 | | class SPI_Master_Class { |
172 | | public: |
173 | | static void begin(int slaveselecter); |
174 | | void enable(int slaveselecter); |
175 | | void disable(); |
176 | | byte write_and_read(byte data) const; |
177 | | void write(byte data) const; |
178 | | byte read() const; |
179 | | |
180 | | private: |
181 | | static boolean initialized_; |
182 | | static const int SS = 10; |
183 | | static const int MOSI = 11; |
184 | | static const int MISO = 12; |
185 | | static const int SCK = 13; |
186 | | static int enabled_; |
187 | | }; |
188 | | |
189 | | extern SPI_Master_Class SPI_Master; |
190 | | |
191 | | #endif //__SPI_H__ |
192 | | }}} |
| 35 | このスケッチはArduinoIDE付属のSPIライブラリを使用しています。 |
| 36 | 古いArduinoIDEをお使いで、このスケッチが上手く動かない場合は、[attachment:MAX6675.zip MAX6675.zip]をお使い下さい。 |